Merge branch 'work.aio-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 4 Jun 2018 20:57:43 +0000 (13:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 4 Jun 2018 20:57:43 +0000 (13:57 -0700)
Pull aio updates from Al Viro:
 "Majority of AIO stuff this cycle. aio-fsync and aio-poll, mostly.

  The only thing I'm holding back for a day or so is Adam's aio ioprio -
  his last-minute fixup is trivial (missing stub in !CONFIG_BLOCK case),
  but let it sit in -next for decency sake..."

* 'work.aio-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits)
  aio: sanitize the limit checking in io_submit(2)
  aio: fold do_io_submit() into callers
  aio: shift copyin of iocb into io_submit_one()
  aio_read_events_ring(): make a bit more readable
  aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way
  aio: take list removal to (some) callers of aio_complete()
  aio: add missing break for the IOCB_CMD_FDSYNC case
  random: convert to ->poll_mask
  timerfd: convert to ->poll_mask
  eventfd: switch to ->poll_mask
  pipe: convert to ->poll_mask
  crypto: af_alg: convert to ->poll_mask
  net/rxrpc: convert to ->poll_mask
  net/iucv: convert to ->poll_mask
  net/phonet: convert to ->poll_mask
  net/nfc: convert to ->poll_mask
  net/caif: convert to ->poll_mask
  net/bluetooth: convert to ->poll_mask
  net/sctp: convert to ->poll_mask
  net/tipc: convert to ->poll_mask
  ...

32 files changed:
1  2 
Documentation/filesystems/Locking
drivers/net/ppp/pppoe.c
drivers/vhost/vhost.c
include/linux/fs.h
include/net/sctp/sctp.h
include/net/tcp.h
include/net/udp.h
net/9p/trans_fd.c
net/ax25/af_ax25.c
net/bluetooth/af_bluetooth.c
net/can/bcm.c
net/core/sock.c
net/dccp/proto.c
net/decnet/af_decnet.c
net/ipv4/tcp.c
net/ipv4/udp.c
net/ipv6/raw.c
net/kcm/kcmsock.c
net/key/af_key.c
net/l2tp/l2tp_ppp.c
net/llc/af_llc.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/packet/af_packet.c
net/phonet/socket.c
net/rose/af_rose.c
net/rxrpc/af_rxrpc.c
net/sctp/ipv6.c
net/sctp/protocol.c
net/sctp/socket.c
net/tipc/socket.c
net/unix/af_unix.c

@@@ -69,31 -69,31 +69,31 @@@ prototypes
  
  locking rules:
        all may block
 -              i_mutex(inode)
 -lookup:               yes
 -create:               yes
 -link:         yes (both)
 -mknod:                yes
 -symlink:      yes
 -mkdir:                yes
 -unlink:               yes (both)
 -rmdir:                yes (both)      (see below)
 -rename:       yes (all)       (see below)
 +              i_rwsem(inode)
 +lookup:               shared
 +create:               exclusive
 +link:         exclusive (both)
 +mknod:                exclusive
 +symlink:      exclusive
 +mkdir:                exclusive
 +unlink:               exclusive (both)
 +rmdir:                exclusive (both)(see below)
 +rename:               exclusive (all) (see below)
  readlink:     no
  get_link:     no
 -setattr:      yes
 +setattr:      exclusive
  permission:   no (may not block if called in rcu-walk mode)
  get_acl:      no
  getattr:      no
  listxattr:    no
  fiemap:               no
  update_time:  no
 -atomic_open:  yes
 +atomic_open:  exclusive
  tmpfile:      no
  
  
 -      Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on
 -victim.
 +      Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_rwsem
 +      exclusive on victim.
        cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem.
  
  See Documentation/filesystems/directory-locking for more detailed discussion
@@@ -111,10 -111,10 +111,10 @@@ prototypes
  
  locking rules:
        all may block
 -              i_mutex(inode)
 +              i_rwsem(inode)
  list:         no
  get:          no
 -set:          yes
 +set:          exclusive
  
  --------------------------- super_operations ---------------------------
  prototypes:
@@@ -217,14 -217,14 +217,14 @@@ prototypes
  locking rules:
        All except set_page_dirty and freepage may block
  
 -                      PageLocked(page)        i_mutex
 +                      PageLocked(page)        i_rwsem
  writepage:            yes, unlocks (see below)
  readpage:             yes, unlocks
  writepages:
  set_page_dirty                no
  readpages:
 -write_begin:          locks the page          yes
 -write_end:            yes, unlocks            yes
 +write_begin:          locks the page          exclusive
 +write_end:            yes, unlocks            exclusive
  bmap:
  invalidatepage:               yes
  releasepage:          yes
@@@ -439,8 -439,9 +439,10 @@@ prototypes
        ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iterate) (struct file *, struct dir_context *);
-       unsigned int (*poll) (struct file *, struct poll_table_struct *);
 +      int (*iterate_shared) (struct file *, struct dir_context *);
+       __poll_t (*poll) (struct file *, struct poll_table_struct *);
+       struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t);
+       __poll_t (*poll_mask) (struct file *, __poll_t);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
  };
  
  locking rules:
-       All may block.
+       All except for ->poll_mask may block.
  
  ->llseek() locking has moved from llseek to the individual llseek
  implementations.  If your fs is not using generic_file_llseek, you
@@@ -481,10 -482,6 +483,10 @@@ mutex or just to use i_size_read() inst
  Note: this does not protect the file->f_pos against concurrent modifications
  since this is something the userspace has to take care about.
  
 +->iterate() is called with i_rwsem exclusive.
 +
 +->iterate_shared() is called with i_rwsem at least shared.
 +
  ->fasync() is responsible for maintaining the FASYNC bit in filp->f_flags.
  Most instances call fasync_helper(), which does that maintenance, so it's
  not normally something one needs to worry about.  Return values > 0 will be
@@@ -503,6 -500,9 +505,9 @@@ in sys_read() and friends
  the lease within the individual filesystem to record the result of the
  operation
  
+ ->poll_mask can be called with or without the waitqueue lock for the waitqueue
+ returned from ->get_poll_head.
  --------------------------- dquot_operations -------------------------------
  prototypes:
        int (*write_dquot) (struct dquot *);
diff --combined drivers/net/ppp/pppoe.c
@@@ -1096,6 -1096,21 +1096,6 @@@ static const struct seq_operations pppo
        .stop           = pppoe_seq_stop,
        .show           = pppoe_seq_show,
  };
 -
 -static int pppoe_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &pppoe_seq_ops,
 -                      sizeof(struct seq_net_private));
 -}
 -
 -static const struct file_operations pppoe_seq_fops = {
 -      .owner          = THIS_MODULE,
 -      .open           = pppoe_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  #endif /* CONFIG_PROC_FS */
  
  static const struct proto_ops pppoe_ops = {
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
        .getname        = pppoe_getname,
-       .poll           = datagram_poll,
+       .poll_mask      = datagram_poll_mask,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
        .setsockopt     = sock_no_setsockopt,
@@@ -1131,8 -1146,7 +1131,8 @@@ static __net_init int pppoe_init_net(st
  
        rwlock_init(&pn->hash_lock);
  
 -      pde = proc_create("pppoe", 0444, net->proc_net, &pppoe_seq_fops);
 +      pde = proc_create_net("pppoe", 0444, net->proc_net,
 +                      &pppoe_seq_ops, sizeof(struct seq_net_private));
  #ifdef CONFIG_PROC_FS
        if (!pde)
                return -ENOMEM;
diff --combined drivers/vhost/vhost.c
@@@ -208,7 -208,7 +208,7 @@@ int vhost_poll_start(struct vhost_poll 
        if (poll->wqh)
                return 0;
  
-       mask = file->f_op->poll(file, &poll->table);
+       mask = vfs_poll(file, &poll->table);
        if (mask)
                vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask));
        if (mask & EPOLLERR) {
@@@ -981,7 -981,6 +981,7 @@@ static int vhost_process_iotlb_msg(stru
  {
        int ret = 0;
  
 +      mutex_lock(&dev->mutex);
        vhost_dev_lock_vqs(dev);
        switch (msg->type) {
        case VHOST_IOTLB_UPDATE:
        }
  
        vhost_dev_unlock_vqs(dev);
 +      mutex_unlock(&dev->mutex);
 +
        return ret;
  }
  ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
diff --combined include/linux/fs.h
@@@ -94,7 -94,7 +94,7 @@@ typedef int (dio_iodone_t)(struct kioc
  
  /*
   * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond
 - * to O_WRONLY and O_RDWR via the strange trick in __dentry_open()
 + * to O_WRONLY and O_RDWR via the strange trick in do_dentry_open()
   */
  
  /* file is open for reading */
@@@ -1250,7 -1250,7 +1250,7 @@@ static inline int locks_lock_file_wait(
  }
  
  struct fasync_struct {
 -      spinlock_t              fa_lock;
 +      rwlock_t                fa_lock;
        int                     magic;
        int                     fa_fd;
        struct fasync_struct    *fa_next; /* singly linked list */
@@@ -1711,6 -1711,8 +1711,8 @@@ struct file_operations 
        int (*iterate) (struct file *, struct dir_context *);
        int (*iterate_shared) (struct file *, struct dir_context *);
        __poll_t (*poll) (struct file *, struct poll_table_struct *);
+       struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t);
+       __poll_t (*poll_mask) (struct file *, __poll_t);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
@@@ -2570,7 -2572,7 +2572,7 @@@ extern bool is_bad_inode(struct inode *
  
  #ifdef CONFIG_BLOCK
  extern void check_disk_size_change(struct gendisk *disk,
 -                                 struct block_device *bdev);
 +              struct block_device *bdev, bool verbose);
  extern int revalidate_disk(struct gendisk *);
  extern int check_disk_change(struct block_device *);
  extern int __invalidate_device(struct block_device *, bool);
diff --combined include/net/sctp/sctp.h
@@@ -103,14 -103,11 +103,13 @@@ void sctp_addr_wq_mgmt(struct net *, st
  /*
   * sctp/socket.c
   */
 +int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
 +                    int addr_len, int flags);
  int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
  int sctp_inet_listen(struct socket *sock, int backlog);
  void sctp_write_space(struct sock *sk);
  void sctp_data_ready(struct sock *sk);
- __poll_t sctp_poll(struct file *file, struct socket *sock,
-               poll_table *wait);
+ __poll_t sctp_poll_mask(struct socket *sock, __poll_t events);
  void sctp_sock_rfree(struct sk_buff *skb);
  void sctp_copy_sock(struct sock *newsk, struct sock *sk,
                    struct sctp_association *asoc);
diff --combined include/net/tcp.h
@@@ -388,8 -388,7 +388,7 @@@ bool tcp_peer_is_proven(struct request_
  void tcp_close(struct sock *sk, long timeout);
  void tcp_init_sock(struct sock *sk);
  void tcp_init_transfer(struct sock *sk, int bpf_op);
- __poll_t tcp_poll(struct file *file, struct socket *sock,
-                     struct poll_table_struct *wait);
+ __poll_t tcp_poll_mask(struct socket *sock, __poll_t events);
  int tcp_getsockopt(struct sock *sk, int level, int optname,
                   char __user *optval, int __user *optlen);
  int tcp_setsockopt(struct sock *sk, int level, int optname,
@@@ -1747,22 -1746,27 +1746,22 @@@ enum tcp_seq_states 
        TCP_SEQ_STATE_ESTABLISHED,
  };
  
 -int tcp_seq_open(struct inode *inode, struct file *file);
 +void *tcp_seq_start(struct seq_file *seq, loff_t *pos);
 +void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos);
 +void tcp_seq_stop(struct seq_file *seq, void *v);
  
  struct tcp_seq_afinfo {
 -      char                            *name;
        sa_family_t                     family;
 -      const struct file_operations    *seq_fops;
 -      struct seq_operations           seq_ops;
  };
  
  struct tcp_iter_state {
        struct seq_net_private  p;
 -      sa_family_t             family;
        enum tcp_seq_states     state;
        struct sock             *syn_wait_sk;
        int                     bucket, offset, sbucket, num;
        loff_t                  last_pos;
  };
  
 -int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
 -void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
 -
  extern struct request_sock_ops tcp_request_sock_ops;
  extern struct request_sock_ops tcp6_request_sock_ops;
  
diff --combined include/net/udp.h
@@@ -276,7 -276,7 +276,7 @@@ int udp_init_sock(struct sock *sk)
  int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
  int __udp_disconnect(struct sock *sk, int flags);
  int udp_disconnect(struct sock *sk, int flags);
- __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);
+ __poll_t udp_poll_mask(struct socket *sock, __poll_t events);
  struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
                                       netdev_features_t features,
                                       bool is_ipv6);
@@@ -408,27 -408,31 +408,27 @@@ do {                                                                    
  #define __UDPX_INC_STATS(sk, field) __UDP_INC_STATS(sock_net(sk), field, 0)
  #endif
  
 -/* /proc */
 -int udp_seq_open(struct inode *inode, struct file *file);
 -
 +#ifdef CONFIG_PROC_FS
  struct udp_seq_afinfo {
 -      char                            *name;
        sa_family_t                     family;
        struct udp_table                *udp_table;
 -      const struct file_operations    *seq_fops;
 -      struct seq_operations           seq_ops;
  };
  
  struct udp_iter_state {
        struct seq_net_private  p;
 -      sa_family_t             family;
        int                     bucket;
 -      struct udp_table        *udp_table;
  };
  
 -#ifdef CONFIG_PROC_FS
 -int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
 -void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
 +void *udp_seq_start(struct seq_file *seq, loff_t *pos);
 +void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos);
 +void udp_seq_stop(struct seq_file *seq, void *v);
 +
 +extern const struct seq_operations udp_seq_ops;
 +extern const struct seq_operations udp6_seq_ops;
  
  int udp4_proc_init(void);
  void udp4_proc_exit(void);
 -#endif
 +#endif /* CONFIG_PROC_FS */
  
  int udpv4_offload_init(void);
  
diff --combined net/9p/trans_fd.c
@@@ -231,7 -231,7 +231,7 @@@ static void p9_conn_cancel(struct p9_co
  static __poll_t
  p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err)
  {
-       __poll_t ret, n;
+       __poll_t ret;
        struct p9_trans_fd *ts = NULL;
  
        if (client && client->status == Connected)
                return EPOLLERR;
        }
  
-       if (!ts->rd->f_op->poll)
-               ret = DEFAULT_POLLMASK;
-       else
-               ret = ts->rd->f_op->poll(ts->rd, pt);
-       if (ts->rd != ts->wr) {
-               if (!ts->wr->f_op->poll)
-                       n = DEFAULT_POLLMASK;
-               else
-                       n = ts->wr->f_op->poll(ts->wr, pt);
-               ret = (ret & ~EPOLLOUT) | (n & ~EPOLLIN);
-       }
+       ret = vfs_poll(ts->rd, pt);
+       if (ts->rd != ts->wr)
+               ret = (ret & ~EPOLLOUT) | (vfs_poll(ts->wr, pt) & ~EPOLLIN);
        return ret;
  }
  
@@@ -1092,8 -1082,8 +1082,8 @@@ static struct p9_trans_module p9_fd_tra
  };
  
  /**
 - * p9_poll_proc - poll worker thread
 - * @a: thread state and arguments
 + * p9_poll_workfn - poll worker thread
 + * @work: work queue
   *
   * polls all v9fs transports for new events and queues the appropriate
   * work to the work queue
diff --combined net/ax25/af_ax25.c
@@@ -1924,6 -1924,19 +1924,6 @@@ static const struct seq_operations ax25
        .stop = ax25_info_stop,
        .show = ax25_info_show,
  };
 -
 -static int ax25_info_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open(file, &ax25_info_seqops);
 -}
 -
 -static const struct file_operations ax25_info_fops = {
 -      .open = ax25_info_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release,
 -};
 -
  #endif
  
  static const struct net_proto_family ax25_family_ops = {
@@@ -1941,7 -1954,7 +1941,7 @@@ static const struct proto_ops ax25_prot
        .socketpair     = sock_no_socketpair,
        .accept         = ax25_accept,
        .getname        = ax25_getname,
-       .poll           = datagram_poll,
+       .poll_mask      = datagram_poll_mask,
        .ioctl          = ax25_ioctl,
        .listen         = ax25_listen,
        .shutdown       = ax25_shutdown,
@@@ -1976,10 -1989,10 +1976,10 @@@ static int __init ax25_init(void
        dev_add_pack(&ax25_packet_type);
        register_netdevice_notifier(&ax25_dev_notifier);
  
 -      proc_create("ax25_route", 0444, init_net.proc_net,
 -                  &ax25_route_fops);
 -      proc_create("ax25", 0444, init_net.proc_net, &ax25_info_fops);
 -      proc_create("ax25_calls", 0444, init_net.proc_net, &ax25_uid_fops);
 +      proc_create_seq("ax25_route", 0444, init_net.proc_net, &ax25_rt_seqops);
 +      proc_create_seq("ax25", 0444, init_net.proc_net, &ax25_info_seqops);
 +      proc_create_seq("ax25_calls", 0444, init_net.proc_net,
 +                      &ax25_uid_seqops);
  out:
        return rc;
  }
@@@ -437,16 -437,13 +437,13 @@@ static inline __poll_t bt_accept_poll(s
        return 0;
  }
  
- __poll_t bt_sock_poll(struct file *file, struct socket *sock,
-                         poll_table *wait)
+ __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        __poll_t mask = 0;
  
        BT_DBG("sock %p, sk %p", sock, sk);
  
-       poll_wait(file, sk_sleep(sk), wait);
        if (sk->sk_state == BT_LISTEN)
                return bt_accept_poll(sk);
  
  
        return mask;
  }
- EXPORT_SYMBOL(bt_sock_poll);
+ EXPORT_SYMBOL(bt_sock_poll_mask);
  
  int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  {
@@@ -605,10 -602,15 +602,10 @@@ int bt_sock_wait_ready(struct sock *sk
  EXPORT_SYMBOL(bt_sock_wait_ready);
  
  #ifdef CONFIG_PROC_FS
 -struct bt_seq_state {
 -      struct bt_sock_list *l;
 -};
 -
  static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(seq->private->l->lock)
  {
 -      struct bt_seq_state *s = seq->private;
 -      struct bt_sock_list *l = s->l;
 +      struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
  
        read_lock(&l->lock);
        return seq_hlist_start_head(&l->head, *pos);
  
  static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
 -      struct bt_seq_state *s = seq->private;
 -      struct bt_sock_list *l = s->l;
 +      struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
  
        return seq_hlist_next(v, &l->head, pos);
  }
  static void bt_seq_stop(struct seq_file *seq, void *v)
        __releases(seq->private->l->lock)
  {
 -      struct bt_seq_state *s = seq->private;
 -      struct bt_sock_list *l = s->l;
 +      struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
  
        read_unlock(&l->lock);
  }
  
  static int bt_seq_show(struct seq_file *seq, void *v)
  {
 -      struct bt_seq_state *s = seq->private;
 -      struct bt_sock_list *l = s->l;
 +      struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
  
        if (v == SEQ_START_TOKEN) {
                seq_puts(seq ,"sk               RefCnt Rmem   Wmem   User   Inode  Parent");
@@@ -673,13 -678,35 +670,13 @@@ static const struct seq_operations bt_s
        .show  = bt_seq_show,
  };
  
 -static int bt_seq_open(struct inode *inode, struct file *file)
 -{
 -      struct bt_sock_list *sk_list;
 -      struct bt_seq_state *s;
 -
 -      sk_list = PDE_DATA(inode);
 -      s = __seq_open_private(file, &bt_seq_ops,
 -                             sizeof(struct bt_seq_state));
 -      if (!s)
 -              return -ENOMEM;
 -
 -      s->l = sk_list;
 -      return 0;
 -}
 -
 -static const struct file_operations bt_fops = {
 -      .open = bt_seq_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release_private
 -};
 -
  int bt_procfs_init(struct net *net, const char *name,
                   struct bt_sock_list *sk_list,
                   int (* seq_show)(struct seq_file *, void *))
  {
        sk_list->custom_seq_show = seq_show;
  
 -      if (!proc_create_data(name, 0, net->proc_net, &bt_fops, sk_list))
 +      if (!proc_create_seq_data(name, 0, net->proc_net, &bt_seq_ops, sk_list))
                return -ENOMEM;
        return 0;
  }
diff --combined net/can/bcm.c
@@@ -239,6 -239,18 +239,6 @@@ static int bcm_proc_show(struct seq_fil
        seq_putc(m, '\n');
        return 0;
  }
 -
 -static int bcm_proc_open(struct inode *inode, struct file *file)
 -{
 -      return single_open_net(inode, file, bcm_proc_show);
 -}
 -
 -static const struct file_operations bcm_proc_fops = {
 -      .open           = bcm_proc_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = single_release,
 -};
  #endif /* CONFIG_PROC_FS */
  
  /*
@@@ -1594,9 -1606,9 +1594,9 @@@ static int bcm_connect(struct socket *s
        if (net->can.bcmproc_dir) {
                /* unique socket address as filename */
                sprintf(bo->procname, "%lu", sock_i_ino(sk));
 -              bo->bcm_proc_read = proc_create_data(bo->procname, 0644,
 +              bo->bcm_proc_read = proc_create_net_single(bo->procname, 0644,
                                                     net->can.bcmproc_dir,
 -                                                   &bcm_proc_fops, sk);
 +                                                   bcm_proc_show, sk);
                if (!bo->bcm_proc_read) {
                        ret = -ENOMEM;
                        goto fail;
@@@ -1657,7 -1669,7 +1657,7 @@@ static const struct proto_ops bcm_ops 
        .socketpair    = sock_no_socketpair,
        .accept        = sock_no_accept,
        .getname       = sock_no_getname,
-       .poll          = datagram_poll,
+       .poll_mask     = datagram_poll_mask,
        .ioctl         = can_ioctl,     /* use can_ioctl() from af_can.c */
        .listen        = sock_no_listen,
        .shutdown      = sock_no_shutdown,
diff --combined net/core/sock.c
@@@ -1606,7 -1606,7 +1606,7 @@@ static void __sk_free(struct sock *sk
        if (likely(sk->sk_net_refcnt))
                sock_inuse_add(sock_net(sk), -1);
  
 -      if (unlikely(sock_diag_has_destroy_listeners(sk) && sk->sk_net_refcnt))
 +      if (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk)))
                sock_diag_broadcast_destroy(sk);
        else
                sk_destruct(sk);
@@@ -2567,12 -2567,6 +2567,6 @@@ int sock_no_getname(struct socket *sock
  }
  EXPORT_SYMBOL(sock_no_getname);
  
- __poll_t sock_no_poll(struct file *file, struct socket *sock, poll_table *pt)
- {
-       return 0;
- }
- EXPORT_SYMBOL(sock_no_poll);
  int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  {
        return -EOPNOTSUPP;
@@@ -3439,10 -3433,22 +3433,10 @@@ static const struct seq_operations prot
        .show   = proto_seq_show,
  };
  
 -static int proto_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &proto_seq_ops,
 -                          sizeof(struct seq_net_private));
 -}
 -
 -static const struct file_operations proto_seq_fops = {
 -      .open           = proto_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  static __net_init int proto_init_net(struct net *net)
  {
 -      if (!proc_create("protocols", 0444, net->proc_net, &proto_seq_fops))
 +      if (!proc_create_net("protocols", 0444, net->proc_net, &proto_seq_ops,
 +                      sizeof(struct seq_net_private)))
                return -ENOMEM;
  
        return 0;
diff --combined net/dccp/proto.c
@@@ -283,7 -283,9 +283,7 @@@ int dccp_disconnect(struct sock *sk, in
  
        dccp_clear_xmit_timers(sk);
        ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk);
 -      ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
        dp->dccps_hc_rx_ccid = NULL;
 -      dp->dccps_hc_tx_ccid = NULL;
  
        __skb_queue_purge(&sk->sk_receive_queue);
        __skb_queue_purge(&sk->sk_write_queue);
  
  EXPORT_SYMBOL_GPL(dccp_disconnect);
  
- /*
-  *    Wait for a DCCP event.
-  *
-  *    Note that we don't need to lock the socket, as the upper poll layers
-  *    take care of normal races (between the test and the event) and we don't
-  *    go look at any of the socket buffers directly.
-  */
- __poll_t dccp_poll(struct file *file, struct socket *sock,
-                      poll_table *wait)
+ __poll_t dccp_poll_mask(struct socket *sock, __poll_t events)
  {
        __poll_t mask;
        struct sock *sk = sock->sk;
  
-       sock_poll_wait(file, sk_sleep(sk), wait);
        if (sk->sk_state == DCCP_LISTEN)
                return inet_csk_listen_poll(sk);
  
        return mask;
  }
  
- EXPORT_SYMBOL_GPL(dccp_poll);
+ EXPORT_SYMBOL_GPL(dccp_poll_mask);
  
  int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
  {
diff --combined net/decnet/af_decnet.c
@@@ -1207,11 -1207,11 +1207,11 @@@ static int dn_getname(struct socket *so
  }
  
  
- static __poll_t dn_poll(struct file *file, struct socket *sock, poll_table  *wait)
+ static __poll_t dn_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct dn_scp *scp = DN_SK(sk);
-       __poll_t mask = datagram_poll(file, sock, wait);
+       __poll_t mask = datagram_poll_mask(sock, events);
  
        if (!skb_queue_empty(&scp->other_receive_queue))
                mask |= EPOLLRDBAND;
@@@ -2314,6 -2314,19 +2314,6 @@@ static const struct seq_operations dn_s
        .stop   = dn_socket_seq_stop,
        .show   = dn_socket_seq_show,
  };
 -
 -static int dn_socket_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_private(file, &dn_socket_seq_ops,
 -                      sizeof(struct dn_iter_state));
 -}
 -
 -static const struct file_operations dn_socket_seq_fops = {
 -      .open           = dn_socket_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_private,
 -};
  #endif
  
  static const struct net_proto_family  dn_family_ops = {
@@@ -2331,7 -2344,7 +2331,7 @@@ static const struct proto_ops dn_proto_
        .socketpair =   sock_no_socketpair,
        .accept =       dn_accept,
        .getname =      dn_getname,
-       .poll =         dn_poll,
+       .poll_mask =    dn_poll_mask,
        .ioctl =        dn_ioctl,
        .listen =       dn_listen,
        .shutdown =     dn_shutdown,
@@@ -2370,9 -2383,7 +2370,9 @@@ static int __init decnet_init(void
        dev_add_pack(&dn_dix_packet_type);
        register_netdevice_notifier(&dn_dev_notifier);
  
 -      proc_create("decnet", 0444, init_net.proc_net, &dn_socket_seq_fops);
 +      proc_create_seq_private("decnet", 0444, init_net.proc_net,
 +                      &dn_socket_seq_ops, sizeof(struct dn_iter_state),
 +                      NULL);
        dn_register_sysctl();
  out:
        return rc;
diff --combined net/ipv4/tcp.c
@@@ -494,32 -494,21 +494,21 @@@ static inline bool tcp_stream_is_readab
  }
  
  /*
-  *    Wait for a TCP event.
-  *
-  *    Note that we don't need to lock the socket, as the upper poll layers
-  *    take care of normal races (between the test and the event) and we don't
-  *    go look at any of the socket buffers directly.
+  * Socket is not locked. We are protected from async events by poll logic and
+  * correct handling of state changes made by other threads is impossible in
+  * any case.
   */
- __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
+ __poll_t tcp_poll_mask(struct socket *sock, __poll_t events)
  {
-       __poll_t mask;
        struct sock *sk = sock->sk;
        const struct tcp_sock *tp = tcp_sk(sk);
+       __poll_t mask = 0;
        int state;
  
-       sock_poll_wait(file, sk_sleep(sk), wait);
        state = inet_sk_state_load(sk);
        if (state == TCP_LISTEN)
                return inet_csk_listen_poll(sk);
  
-       /* Socket is not locked. We are protected from async events
-        * by poll logic and correct handling of state changes
-        * made by other threads is impossible in any case.
-        */
-       mask = 0;
        /*
         * EPOLLHUP is certainly not done right. But poll() doesn't
         * have a notion of HUP in just one direction, and for a
  
        return mask;
  }
- EXPORT_SYMBOL(tcp_poll);
+ EXPORT_SYMBOL(tcp_poll_mask);
  
  int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
  {
@@@ -697,7 -686,7 +686,7 @@@ static bool tcp_should_autocork(struct 
  {
        return skb->len < size_goal &&
               sock_net(sk)->ipv4.sysctl_tcp_autocorking &&
 -             skb != tcp_write_queue_head(sk) &&
 +             !tcp_rtx_queue_empty(sk) &&
               refcount_read(&sk->sk_wmem_alloc) > skb->truesize;
  }
  
@@@ -1204,8 -1193,7 +1193,8 @@@ int tcp_sendmsg_locked(struct sock *sk
                        uarg->zerocopy = 0;
        }
  
 -      if (unlikely(flags & MSG_FASTOPEN || inet_sk(sk)->defer_connect)) {
 +      if (unlikely(flags & MSG_FASTOPEN || inet_sk(sk)->defer_connect) &&
 +          !tp->repair) {
                err = tcp_sendmsg_fastopen(sk, msg, &copied_syn, size);
                if (err == -EINPROGRESS && copied_syn > 0)
                        goto out;
@@@ -2674,7 -2662,7 +2663,7 @@@ static int do_tcp_setsockopt(struct soc
        case TCP_REPAIR_QUEUE:
                if (!tp->repair)
                        err = -EPERM;
 -              else if (val < TCP_QUEUES_NR)
 +              else if ((unsigned int)val < TCP_QUEUES_NR)
                        tp->repair_queue = val;
                else
                        err = -EINVAL;
diff --combined net/ipv4/udp.c
@@@ -401,9 -401,9 +401,9 @@@ static int compute_score(struct sock *s
                bool dev_match = (sk->sk_bound_dev_if == dif ||
                                  sk->sk_bound_dev_if == sdif);
  
 -              if (exact_dif && !dev_match)
 +              if (!dev_match)
                        return -1;
 -              if (sk->sk_bound_dev_if && dev_match)
 +              if (sk->sk_bound_dev_if)
                        score += 4;
        }
  
@@@ -952,10 -952,8 +952,10 @@@ int udp_sendmsg(struct sock *sk, struc
        sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
  
        if (ipc.opt && ipc.opt->opt.srr) {
 -              if (!daddr)
 -                      return -EINVAL;
 +              if (!daddr) {
 +                      err = -EINVAL;
 +                      goto out_free;
 +              }
                faddr = ipc.opt->opt.faddr;
                connected = 0;
        }
@@@ -1076,7 -1074,6 +1076,7 @@@ do_append_data
  
  out:
        ip_rt_put(rt);
 +out_free:
        if (free)
                kfree(ipc.opt);
        if (!err)
@@@ -2501,7 -2498,7 +2501,7 @@@ int compat_udp_getsockopt(struct sock *
   *    udp_poll - wait for a UDP event.
   *    @file - file struct
   *    @sock - socket
-  *    @wait - poll table
+  *    @events - events to wait for
   *
   *    This is same as datagram poll, except for the special case of
   *    blocking sockets. If application is using a blocking fd
   *    but then block when reading it. Add special case code
   *    to work around these arguably broken applications.
   */
- __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait)
+ __poll_t udp_poll_mask(struct socket *sock, __poll_t events)
  {
-       __poll_t mask = datagram_poll(file, sock, wait);
+       __poll_t mask = datagram_poll_mask(sock, events);
        struct sock *sk = sock->sk;
  
        if (!skb_queue_empty(&udp_sk(sk)->reader_queue))
                mask |= EPOLLIN | EPOLLRDNORM;
  
        /* Check for false positives due to checksum errors */
-       if ((mask & EPOLLRDNORM) && !(file->f_flags & O_NONBLOCK) &&
+       if ((mask & EPOLLRDNORM) && !(sock->file->f_flags & O_NONBLOCK) &&
            !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1)
                mask &= ~(EPOLLIN | EPOLLRDNORM);
  
        return mask;
  
  }
- EXPORT_SYMBOL(udp_poll);
+ EXPORT_SYMBOL(udp_poll_mask);
  
  int udp_abort(struct sock *sk, int err)
  {
@@@ -2582,13 -2579,12 +2582,13 @@@ EXPORT_SYMBOL(udp_prot)
  static struct sock *udp_get_first(struct seq_file *seq, int start)
  {
        struct sock *sk;
 +      struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
        struct udp_iter_state *state = seq->private;
        struct net *net = seq_file_net(seq);
  
 -      for (state->bucket = start; state->bucket <= state->udp_table->mask;
 +      for (state->bucket = start; state->bucket <= afinfo->udp_table->mask;
             ++state->bucket) {
 -              struct udp_hslot *hslot = &state->udp_table->hash[state->bucket];
 +              struct udp_hslot *hslot = &afinfo->udp_table->hash[state->bucket];
  
                if (hlist_empty(&hslot->head))
                        continue;
                sk_for_each(sk, &hslot->head) {
                        if (!net_eq(sock_net(sk), net))
                                continue;
 -                      if (sk->sk_family == state->family)
 +                      if (sk->sk_family == afinfo->family)
                                goto found;
                }
                spin_unlock_bh(&hslot->lock);
@@@ -2609,17 -2605,16 +2609,17 @@@ found
  
  static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk)
  {
 +      struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
        struct udp_iter_state *state = seq->private;
        struct net *net = seq_file_net(seq);
  
        do {
                sk = sk_next(sk);
 -      } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family));
 +      } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != afinfo->family));
  
        if (!sk) {
 -              if (state->bucket <= state->udp_table->mask)
 -                      spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
 +              if (state->bucket <= afinfo->udp_table->mask)
 +                      spin_unlock_bh(&afinfo->udp_table->hash[state->bucket].lock);
                return udp_get_first(seq, state->bucket + 1);
        }
        return sk;
@@@ -2635,16 -2630,15 +2635,16 @@@ static struct sock *udp_get_idx(struct 
        return pos ? NULL : sk;
  }
  
 -static void *udp_seq_start(struct seq_file *seq, loff_t *pos)
 +void *udp_seq_start(struct seq_file *seq, loff_t *pos)
  {
        struct udp_iter_state *state = seq->private;
        state->bucket = MAX_UDP_PORTS;
  
        return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
  }
 +EXPORT_SYMBOL(udp_seq_start);
  
 -static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 +void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
        struct sock *sk;
  
        ++*pos;
        return sk;
  }
 +EXPORT_SYMBOL(udp_seq_next);
  
 -static void udp_seq_stop(struct seq_file *seq, void *v)
 +void udp_seq_stop(struct seq_file *seq, void *v)
  {
 +      struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
        struct udp_iter_state *state = seq->private;
  
 -      if (state->bucket <= state->udp_table->mask)
 -              spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
 +      if (state->bucket <= afinfo->udp_table->mask)
 +              spin_unlock_bh(&afinfo->udp_table->hash[state->bucket].lock);
  }
 -
 -int udp_seq_open(struct inode *inode, struct file *file)
 -{
 -      struct udp_seq_afinfo *afinfo = PDE_DATA(inode);
 -      struct udp_iter_state *s;
 -      int err;
 -
 -      err = seq_open_net(inode, file, &afinfo->seq_ops,
 -                         sizeof(struct udp_iter_state));
 -      if (err < 0)
 -              return err;
 -
 -      s = ((struct seq_file *)file->private_data)->private;
 -      s->family               = afinfo->family;
 -      s->udp_table            = afinfo->udp_table;
 -      return err;
 -}
 -EXPORT_SYMBOL(udp_seq_open);
 -
 -/* ------------------------------------------------------------------------ */
 -int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
 -{
 -      struct proc_dir_entry *p;
 -      int rc = 0;
 -
 -      afinfo->seq_ops.start           = udp_seq_start;
 -      afinfo->seq_ops.next            = udp_seq_next;
 -      afinfo->seq_ops.stop            = udp_seq_stop;
 -
 -      p = proc_create_data(afinfo->name, 0444, net->proc_net,
 -                           afinfo->seq_fops, afinfo);
 -      if (!p)
 -              rc = -ENOMEM;
 -      return rc;
 -}
 -EXPORT_SYMBOL(udp_proc_register);
 -
 -void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo)
 -{
 -      remove_proc_entry(afinfo->name, net->proc_net);
 -}
 -EXPORT_SYMBOL(udp_proc_unregister);
 +EXPORT_SYMBOL(udp_seq_stop);
  
  /* ------------------------------------------------------------------------ */
  static void udp4_format_sock(struct sock *sp, struct seq_file *f,
@@@ -2706,30 -2739,32 +2706,30 @@@ int udp4_seq_show(struct seq_file *seq
        return 0;
  }
  
 -static const struct file_operations udp_afinfo_seq_fops = {
 -      .open     = udp_seq_open,
 -      .read     = seq_read,
 -      .llseek   = seq_lseek,
 -      .release  = seq_release_net
 +const struct seq_operations udp_seq_ops = {
 +      .start          = udp_seq_start,
 +      .next           = udp_seq_next,
 +      .stop           = udp_seq_stop,
 +      .show           = udp4_seq_show,
  };
 +EXPORT_SYMBOL(udp_seq_ops);
  
 -/* ------------------------------------------------------------------------ */
  static struct udp_seq_afinfo udp4_seq_afinfo = {
 -      .name           = "udp",
        .family         = AF_INET,
        .udp_table      = &udp_table,
 -      .seq_fops       = &udp_afinfo_seq_fops,
 -      .seq_ops        = {
 -              .show           = udp4_seq_show,
 -      },
  };
  
  static int __net_init udp4_proc_init_net(struct net *net)
  {
 -      return udp_proc_register(net, &udp4_seq_afinfo);
 +      if (!proc_create_net_data("udp", 0444, net->proc_net, &udp_seq_ops,
 +                      sizeof(struct udp_iter_state), &udp4_seq_afinfo))
 +              return -ENOMEM;
 +      return 0;
  }
  
  static void __net_exit udp4_proc_exit_net(struct net *net)
  {
 -      udp_proc_unregister(net, &udp4_seq_afinfo);
 +      remove_proc_entry("udp", net->proc_net);
  }
  
  static struct pernet_operations udp4_net_ops = {
diff --combined net/ipv6/raw.c
@@@ -1304,10 -1304,21 +1304,10 @@@ static const struct seq_operations raw6
        .show =         raw6_seq_show,
  };
  
 -static int raw6_seq_open(struct inode *inode, struct file *file)
 -{
 -      return raw_seq_open(inode, file, &raw_v6_hashinfo, &raw6_seq_ops);
 -}
 -
 -static const struct file_operations raw6_seq_fops = {
 -      .open =         raw6_seq_open,
 -      .read =         seq_read,
 -      .llseek =       seq_lseek,
 -      .release =      seq_release_net,
 -};
 -
  static int __net_init raw6_init_net(struct net *net)
  {
 -      if (!proc_create("raw6", 0444, net->proc_net, &raw6_seq_fops))
 +      if (!proc_create_net_data("raw6", 0444, net->proc_net, &raw6_seq_ops,
 +                      sizeof(struct raw_iter_state), &raw_v6_hashinfo))
                return -ENOMEM;
  
        return 0;
@@@ -1334,7 -1345,7 +1334,7 @@@ void raw6_proc_exit(void
  }
  #endif        /* CONFIG_PROC_FS */
  
- /* Same as inet6_dgram_ops, sans udp_poll.  */
+ /* Same as inet6_dgram_ops, sans udp_poll_mask.  */
  const struct proto_ops inet6_sockraw_ops = {
        .family            = PF_INET6,
        .owner             = THIS_MODULE,
        .socketpair        = sock_no_socketpair,        /* a do nothing */
        .accept            = sock_no_accept,            /* a do nothing */
        .getname           = inet6_getname,
-       .poll              = datagram_poll,             /* ok           */
+       .poll_mask         = datagram_poll_mask,        /* ok           */
        .ioctl             = inet6_ioctl,               /* must change  */
        .listen            = sock_no_listen,            /* ok           */
        .shutdown          = inet_shutdown,             /* ok           */
diff --combined net/kcm/kcmsock.c
@@@ -1336,9 -1336,9 +1336,9 @@@ static void init_kcm_sock(struct kcm_so
        struct list_head *head;
        int index = 0;
  
-       /* For SOCK_SEQPACKET sock type, datagram_poll checks the sk_state, so
-        * we set sk_state, otherwise epoll_wait always returns right away with
-        * EPOLLHUP
+       /* For SOCK_SEQPACKET sock type, datagram_poll_mask checks the sk_state,
+        * so  we set sk_state, otherwise epoll_wait always returns right away
+        * with EPOLLHUP
         */
        kcm->sk.sk_state = TCP_ESTABLISHED;
  
@@@ -1671,7 -1671,7 +1671,7 @@@ static struct file *kcm_clone(struct so
        __module_get(newsock->ops->owner);
  
        newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL,
 -                       &kcm_proto, true);
 +                       &kcm_proto, false);
        if (!newsk) {
                sock_release(newsock);
                return ERR_PTR(-ENOMEM);
@@@ -1903,7 -1903,7 +1903,7 @@@ static const struct proto_ops kcm_dgram
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
        .getname =      sock_no_getname,
-       .poll =         datagram_poll,
+       .poll_mask =    datagram_poll_mask,
        .ioctl =        kcm_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
@@@ -1924,7 -1924,7 +1924,7 @@@ static const struct proto_ops kcm_seqpa
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
        .getname =      sock_no_getname,
-       .poll =         datagram_poll,
+       .poll_mask =    datagram_poll_mask,
        .ioctl =        kcm_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
diff --combined net/key/af_key.c
@@@ -437,24 -437,6 +437,24 @@@ static int verify_address_len(const voi
        return 0;
  }
  
 +static inline int sadb_key_len(const struct sadb_key *key)
 +{
 +      int key_bytes = DIV_ROUND_UP(key->sadb_key_bits, 8);
 +
 +      return DIV_ROUND_UP(sizeof(struct sadb_key) + key_bytes,
 +                          sizeof(uint64_t));
 +}
 +
 +static int verify_key_len(const void *p)
 +{
 +      const struct sadb_key *key = p;
 +
 +      if (sadb_key_len(key) > key->sadb_key_len)
 +              return -EINVAL;
 +
 +      return 0;
 +}
 +
  static inline int pfkey_sec_ctx_len(const struct sadb_x_sec_ctx *sec_ctx)
  {
        return DIV_ROUND_UP(sizeof(struct sadb_x_sec_ctx) +
@@@ -551,25 -533,16 +551,25 @@@ static int parse_exthdrs(struct sk_buf
                                return -EINVAL;
                        if (ext_hdrs[ext_type-1] != NULL)
                                return -EINVAL;
 -                      if (ext_type == SADB_EXT_ADDRESS_SRC ||
 -                          ext_type == SADB_EXT_ADDRESS_DST ||
 -                          ext_type == SADB_EXT_ADDRESS_PROXY ||
 -                          ext_type == SADB_X_EXT_NAT_T_OA) {
 +                      switch (ext_type) {
 +                      case SADB_EXT_ADDRESS_SRC:
 +                      case SADB_EXT_ADDRESS_DST:
 +                      case SADB_EXT_ADDRESS_PROXY:
 +                      case SADB_X_EXT_NAT_T_OA:
                                if (verify_address_len(p))
                                        return -EINVAL;
 -                      }
 -                      if (ext_type == SADB_X_EXT_SEC_CTX) {
 +                              break;
 +                      case SADB_X_EXT_SEC_CTX:
                                if (verify_sec_ctx_len(p))
                                        return -EINVAL;
 +                              break;
 +                      case SADB_EXT_KEY_AUTH:
 +                      case SADB_EXT_KEY_ENCRYPT:
 +                              if (verify_key_len(p))
 +                                      return -EINVAL;
 +                              break;
 +                      default:
 +                              break;
                        }
                        ext_hdrs[ext_type-1] = (void *) p;
                }
@@@ -1131,12 -1104,14 +1131,12 @@@ static struct xfrm_state * pfkey_msg2xf
        key = ext_hdrs[SADB_EXT_KEY_AUTH - 1];
        if (key != NULL &&
            sa->sadb_sa_auth != SADB_X_AALG_NULL &&
 -          ((key->sadb_key_bits+7) / 8 == 0 ||
 -           (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t)))
 +          key->sadb_key_bits == 0)
                return ERR_PTR(-EINVAL);
        key = ext_hdrs[SADB_EXT_KEY_ENCRYPT-1];
        if (key != NULL &&
            sa->sadb_sa_encrypt != SADB_EALG_NULL &&
 -          ((key->sadb_key_bits+7) / 8 == 0 ||
 -           (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t)))
 +          key->sadb_key_bits == 0)
                return ERR_PTR(-EINVAL);
  
        x = xfrm_state_alloc(net);
@@@ -3751,7 -3726,7 +3751,7 @@@ static const struct proto_ops pfkey_op
  
        /* Now the operations that really occur. */
        .release        =       pfkey_release,
-       .poll           =       datagram_poll,
+       .poll_mask      =       datagram_poll_mask,
        .sendmsg        =       pfkey_sendmsg,
        .recvmsg        =       pfkey_recvmsg,
  };
@@@ -3812,12 -3787,24 +3812,12 @@@ static const struct seq_operations pfke
        .show   = pfkey_seq_show,
  };
  
 -static int pfkey_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &pfkey_seq_ops,
 -                          sizeof(struct seq_net_private));
 -}
 -
 -static const struct file_operations pfkey_proc_ops = {
 -      .open    = pfkey_seq_open,
 -      .read    = seq_read,
 -      .llseek  = seq_lseek,
 -      .release = seq_release_net,
 -};
 -
  static int __net_init pfkey_init_proc(struct net *net)
  {
        struct proc_dir_entry *e;
  
 -      e = proc_create("pfkey", 0, net->proc_net, &pfkey_proc_ops);
 +      e = proc_create_net("pfkey", 0, net->proc_net, &pfkey_seq_ops,
 +                      sizeof(struct seq_net_private));
        if (e == NULL)
                return -ENOMEM;
  
diff --combined net/l2tp/l2tp_ppp.c
@@@ -1742,6 -1742,24 +1742,6 @@@ static const struct seq_operations pppo
        .stop           = pppol2tp_seq_stop,
        .show           = pppol2tp_seq_show,
  };
 -
 -/* Called when our /proc file is opened. We allocate data for use when
 - * iterating our tunnel / session contexts and store it in the private
 - * data of the seq_file.
 - */
 -static int pppol2tp_proc_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &pppol2tp_seq_ops,
 -                          sizeof(struct pppol2tp_seq_data));
 -}
 -
 -static const struct file_operations pppol2tp_proc_fops = {
 -      .open           = pppol2tp_proc_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  #endif /* CONFIG_PROC_FS */
  
  /*****************************************************************************
@@@ -1753,8 -1771,8 +1753,8 @@@ static __net_init int pppol2tp_init_net
        struct proc_dir_entry *pde;
        int err = 0;
  
 -      pde = proc_create("pppol2tp", 0444, net->proc_net,
 -                        &pppol2tp_proc_fops);
 +      pde = proc_create_net("pppol2tp", 0444, net->proc_net,
 +                      &pppol2tp_seq_ops, sizeof(struct pppol2tp_seq_data));
        if (!pde) {
                err = -ENOMEM;
                goto out;
@@@ -1788,7 -1806,7 +1788,7 @@@ static const struct proto_ops pppol2tp_
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
        .getname        = pppol2tp_getname,
-       .poll           = datagram_poll,
+       .poll_mask      = datagram_poll_mask,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
        .setsockopt     = pppol2tp_setsockopt,
diff --combined net/llc/af_llc.c
@@@ -930,9 -930,6 +930,9 @@@ static int llc_ui_sendmsg(struct socke
        if (size > llc->dev->mtu)
                size = llc->dev->mtu;
        copied = size - hdrlen;
 +      rc = -EINVAL;
 +      if (copied < 0)
 +              goto release;
        release_sock(sk);
        skb = sock_alloc_send_skb(sk, size, noblock, &rc);
        lock_sock(sk);
@@@ -1192,7 -1189,7 +1192,7 @@@ static const struct proto_ops llc_ui_op
        .socketpair  = sock_no_socketpair,
        .accept      = llc_ui_accept,
        .getname     = llc_ui_getname,
-       .poll        = datagram_poll,
+       .poll_mask   = datagram_poll_mask,
        .ioctl       = llc_ui_ioctl,
        .listen      = llc_ui_listen,
        .shutdown    = llc_ui_shutdown,
diff --combined net/netlink/af_netlink.c
@@@ -2606,13 -2606,13 +2606,13 @@@ static int netlink_seq_show(struct seq_
  {
        if (v == SEQ_START_TOKEN) {
                seq_puts(seq,
 -                       "sk       Eth Pid    Groups   "
 -                       "Rmem     Wmem     Dump     Locks     Drops     Inode\n");
 +                       "sk               Eth Pid        Groups   "
 +                       "Rmem     Wmem     Dump  Locks    Drops    Inode\n");
        } else {
                struct sock *s = v;
                struct netlink_sock *nlk = nlk_sk(s);
  
 -              seq_printf(seq, "%pK %-3d %-6u %08x %-8d %-8d %d %-8d %-8d %-8lu\n",
 +              seq_printf(seq, "%pK %-3d %-10u %08x %-8d %-8d %-5d %-8d %-8d %-8lu\n",
                           s,
                           s->sk_protocol,
                           nlk->portid,
@@@ -2635,6 -2635,21 +2635,6 @@@ static const struct seq_operations netl
        .stop   = netlink_seq_stop,
        .show   = netlink_seq_show,
  };
 -
 -
 -static int netlink_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &netlink_seq_ops,
 -                              sizeof(struct nl_seq_iter));
 -}
 -
 -static const struct file_operations netlink_seq_fops = {
 -      .open           = netlink_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  #endif
  
  int netlink_register_notifier(struct notifier_block *nb)
@@@ -2658,7 -2673,7 +2658,7 @@@ static const struct proto_ops netlink_o
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
        .getname =      netlink_getname,
-       .poll =         datagram_poll,
+       .poll_mask =    datagram_poll_mask,
        .ioctl =        netlink_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
@@@ -2679,8 -2694,7 +2679,8 @@@ static const struct net_proto_family ne
  static int __net_init netlink_net_init(struct net *net)
  {
  #ifdef CONFIG_PROC_FS
 -      if (!proc_create("netlink", 0, net->proc_net, &netlink_seq_fops))
 +      if (!proc_create_net("netlink", 0, net->proc_net, &netlink_seq_ops,
 +                      sizeof(struct nl_seq_iter)))
                return -ENOMEM;
  #endif
        return 0;
diff --combined net/netrom/af_netrom.c
@@@ -1338,6 -1338,18 +1338,6 @@@ static const struct seq_operations nr_i
        .stop = nr_info_stop,
        .show = nr_info_show,
  };
 -
 -static int nr_info_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open(file, &nr_info_seqops);
 -}
 -
 -static const struct file_operations nr_info_fops = {
 -      .open = nr_info_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release,
 -};
  #endif        /* CONFIG_PROC_FS */
  
  static const struct net_proto_family nr_family_ops = {
@@@ -1355,7 -1367,7 +1355,7 @@@ static const struct proto_ops nr_proto_
        .socketpair     =       sock_no_socketpair,
        .accept         =       nr_accept,
        .getname        =       nr_getname,
-       .poll           =       datagram_poll,
+       .poll_mask      =       datagram_poll_mask,
        .ioctl          =       nr_ioctl,
        .listen         =       nr_listen,
        .shutdown       =       sock_no_shutdown,
@@@ -1438,9 -1450,9 +1438,9 @@@ static int __init nr_proto_init(void
  
        nr_loopback_init();
  
 -      proc_create("nr", 0444, init_net.proc_net, &nr_info_fops);
 -      proc_create("nr_neigh", 0444, init_net.proc_net, &nr_neigh_fops);
 -      proc_create("nr_nodes", 0444, init_net.proc_net, &nr_nodes_fops);
 +      proc_create_seq("nr", 0444, init_net.proc_net, &nr_info_seqops);
 +      proc_create_seq("nr_neigh", 0444, init_net.proc_net, &nr_neigh_seqops);
 +      proc_create_seq("nr_nodes", 0444, init_net.proc_net, &nr_node_seqops);
  out:
        return rc;
  fail:
diff --combined net/packet/af_packet.c
@@@ -2903,15 -2903,13 +2903,15 @@@ static int packet_snd(struct socket *so
        if (skb == NULL)
                goto out_unlock;
  
 -      skb_set_network_header(skb, reserve);
 +      skb_reset_network_header(skb);
  
        err = -EINVAL;
        if (sock->type == SOCK_DGRAM) {
                offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len);
                if (unlikely(offset < 0))
                        goto out_free;
 +      } else if (reserve) {
 +              skb_reserve(skb, -reserve);
        }
  
        /* Returns -EFAULT on error */
@@@ -4110,12 -4108,11 +4110,11 @@@ static int packet_ioctl(struct socket *
        return 0;
  }
  
- static __poll_t packet_poll(struct file *file, struct socket *sock,
-                               poll_table *wait)
+ static __poll_t packet_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct packet_sock *po = pkt_sk(sk);
-       __poll_t mask = datagram_poll(file, sock, wait);
+       __poll_t mask = datagram_poll_mask(sock, events);
  
        spin_lock_bh(&sk->sk_receive_queue.lock);
        if (po->rx_ring.pg_vec) {
@@@ -4457,7 -4454,7 +4456,7 @@@ static const struct proto_ops packet_op
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
        .getname =      packet_getname_spkt,
-       .poll =         datagram_poll,
+       .poll_mask =    datagram_poll_mask,
        .ioctl =        packet_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
@@@ -4478,7 -4475,7 +4477,7 @@@ static const struct proto_ops packet_op
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
        .getname =      packet_getname,
-       .poll =         packet_poll,
+       .poll_mask =    packet_poll_mask,
        .ioctl =        packet_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
@@@ -4556,6 -4553,20 +4555,6 @@@ static const struct seq_operations pack
        .stop   = packet_seq_stop,
        .show   = packet_seq_show,
  };
 -
 -static int packet_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &packet_seq_ops,
 -                          sizeof(struct seq_net_private));
 -}
 -
 -static const struct file_operations packet_seq_fops = {
 -      .open           = packet_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  #endif
  
  static int __net_init packet_net_init(struct net *net)
        mutex_init(&net->packet.sklist_lock);
        INIT_HLIST_HEAD(&net->packet.sklist);
  
 -      if (!proc_create("packet", 0, net->proc_net, &packet_seq_fops))
 +      if (!proc_create_net("packet", 0, net->proc_net, &packet_seq_ops,
 +                      sizeof(struct seq_net_private)))
                return -ENOMEM;
  
        return 0;
diff --combined net/phonet/socket.c
@@@ -340,15 -340,12 +340,12 @@@ static int pn_socket_getname(struct soc
        return sizeof(struct sockaddr_pn);
  }
  
- static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
-                                       poll_table *wait)
+ static __poll_t pn_socket_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct pep_sock *pn = pep_sk(sk);
        __poll_t mask = 0;
  
-       poll_wait(file, sk_sleep(sk), wait);
        if (sk->sk_state == TCP_CLOSE)
                return EPOLLERR;
        if (!skb_queue_empty(&sk->sk_receive_queue))
@@@ -448,7 -445,7 +445,7 @@@ const struct proto_ops phonet_dgram_op
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
        .getname        = pn_socket_getname,
-       .poll           = datagram_poll,
+       .poll_mask      = datagram_poll_mask,
        .ioctl          = pn_socket_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
@@@ -473,7 -470,7 +470,7 @@@ const struct proto_ops phonet_stream_op
        .socketpair     = sock_no_socketpair,
        .accept         = pn_socket_accept,
        .getname        = pn_socket_getname,
-       .poll           = pn_socket_poll,
+       .poll_mask      = pn_socket_poll_mask,
        .ioctl          = pn_socket_ioctl,
        .listen         = pn_socket_listen,
        .shutdown       = sock_no_shutdown,
@@@ -620,12 -617,25 +617,12 @@@ static int pn_sock_seq_show(struct seq_
        return 0;
  }
  
 -static const struct seq_operations pn_sock_seq_ops = {
 +const struct seq_operations pn_sock_seq_ops = {
        .start = pn_sock_seq_start,
        .next = pn_sock_seq_next,
        .stop = pn_sock_seq_stop,
        .show = pn_sock_seq_show,
  };
 -
 -static int pn_sock_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &pn_sock_seq_ops,
 -                              sizeof(struct seq_net_private));
 -}
 -
 -const struct file_operations pn_sock_seq_fops = {
 -      .open = pn_sock_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release_net,
 -};
  #endif
  
  static struct  {
@@@ -789,10 -799,23 +786,10 @@@ static int pn_res_seq_show(struct seq_f
        return 0;
  }
  
 -static const struct seq_operations pn_res_seq_ops = {
 +const struct seq_operations pn_res_seq_ops = {
        .start = pn_res_seq_start,
        .next = pn_res_seq_next,
        .stop = pn_res_seq_stop,
        .show = pn_res_seq_show,
  };
 -
 -static int pn_res_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &pn_res_seq_ops,
 -                              sizeof(struct seq_net_private));
 -}
 -
 -const struct file_operations pn_res_seq_fops = {
 -      .open = pn_res_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release_net,
 -};
  #endif
diff --combined net/rose/af_rose.c
@@@ -1453,6 -1453,18 +1453,6 @@@ static const struct seq_operations rose
        .stop = rose_info_stop,
        .show = rose_info_show,
  };
 -
 -static int rose_info_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open(file, &rose_info_seqops);
 -}
 -
 -static const struct file_operations rose_info_fops = {
 -      .open = rose_info_open,
 -      .read = seq_read,
 -      .llseek = seq_lseek,
 -      .release = seq_release,
 -};
  #endif        /* CONFIG_PROC_FS */
  
  static const struct net_proto_family rose_family_ops = {
@@@ -1470,7 -1482,7 +1470,7 @@@ static const struct proto_ops rose_prot
        .socketpair     =       sock_no_socketpair,
        .accept         =       rose_accept,
        .getname        =       rose_getname,
-       .poll           =       datagram_poll,
+       .poll_mask      =       datagram_poll_mask,
        .ioctl          =       rose_ioctl,
        .listen         =       rose_listen,
        .shutdown       =       sock_no_shutdown,
@@@ -1555,13 -1567,13 +1555,13 @@@ static int __init rose_proto_init(void
  
        rose_add_loopback_neigh();
  
 -      proc_create("rose", 0444, init_net.proc_net, &rose_info_fops);
 -      proc_create("rose_neigh", 0444, init_net.proc_net,
 -                  &rose_neigh_fops);
 -      proc_create("rose_nodes", 0444, init_net.proc_net,
 -                  &rose_nodes_fops);
 -      proc_create("rose_routes", 0444, init_net.proc_net,
 -                  &rose_routes_fops);
 +      proc_create_seq("rose", 0444, init_net.proc_net, &rose_info_seqops);
 +      proc_create_seq("rose_neigh", 0444, init_net.proc_net,
 +                  &rose_neigh_seqops);
 +      proc_create_seq("rose_nodes", 0444, init_net.proc_net,
 +                  &rose_node_seqops);
 +      proc_create_seq("rose_routes", 0444, init_net.proc_net,
 +                  &rose_route_seqops);
  out:
        return rc;
  fail:
diff --combined net/rxrpc/af_rxrpc.c
@@@ -313,7 -313,7 +313,7 @@@ struct rxrpc_call *rxrpc_kernel_begin_c
        memset(&cp, 0, sizeof(cp));
        cp.local                = rx->local;
        cp.key                  = key;
 -      cp.security_level       = 0;
 +      cp.security_level       = rx->min_sec_level;
        cp.exclusive            = false;
        cp.upgrade              = upgrade;
        cp.service_id           = srx->srx_service;
@@@ -734,15 -734,11 +734,11 @@@ static int rxrpc_getsockopt(struct sock
  /*
   * permit an RxRPC socket to be polled
   */
- static __poll_t rxrpc_poll(struct file *file, struct socket *sock,
-                              poll_table *wait)
+ static __poll_t rxrpc_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct rxrpc_sock *rx = rxrpc_sk(sk);
-       __poll_t mask;
-       sock_poll_wait(file, sk_sleep(sk), wait);
-       mask = 0;
+       __poll_t mask = 0;
  
        /* the socket is readable if there are any messages waiting on the Rx
         * queue */
@@@ -949,7 -945,7 +945,7 @@@ static const struct proto_ops rxrpc_rpc
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
        .getname        = sock_no_getname,
-       .poll           = rxrpc_poll,
+       .poll_mask      = rxrpc_poll_mask,
        .ioctl          = sock_no_ioctl,
        .listen         = rxrpc_listen,
        .shutdown       = rxrpc_shutdown,
diff --combined net/sctp/ipv6.c
@@@ -895,9 -895,6 +895,9 @@@ static int sctp_inet6_cmp_addr(const un
        if (sctp_is_any(sk, addr1) || sctp_is_any(sk, addr2))
                return 1;
  
 +      if (addr1->sa.sa_family == AF_INET && addr2->sa.sa_family == AF_INET)
 +              return addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr;
 +
        return __sctp_v6_cmp_addr(addr1, addr2);
  }
  
@@@ -1006,11 -1003,11 +1006,11 @@@ static const struct proto_ops inet6_seq
        .owner             = THIS_MODULE,
        .release           = inet6_release,
        .bind              = inet6_bind,
 -      .connect           = inet_dgram_connect,
 +      .connect           = sctp_inet_connect,
        .socketpair        = sock_no_socketpair,
        .accept            = inet_accept,
        .getname           = sctp_getname,
-       .poll              = sctp_poll,
+       .poll_mask         = sctp_poll_mask,
        .ioctl             = inet6_ioctl,
        .listen            = sctp_inet_listen,
        .shutdown          = inet_shutdown,
diff --combined net/sctp/protocol.c
@@@ -1012,11 -1012,11 +1012,11 @@@ static const struct proto_ops inet_seqp
        .owner             = THIS_MODULE,
        .release           = inet_release,      /* Needs to be wrapped... */
        .bind              = inet_bind,
 -      .connect           = inet_dgram_connect,
 +      .connect           = sctp_inet_connect,
        .socketpair        = sock_no_socketpair,
        .accept            = inet_accept,
        .getname           = inet_getname,      /* Semantics are different.  */
-       .poll              = sctp_poll,
+       .poll_mask         = sctp_poll_mask,
        .ioctl             = inet_ioctl,
        .listen            = sctp_inet_listen,
        .shutdown          = inet_shutdown,     /* Looks harmless.  */
diff --combined net/sctp/socket.c
@@@ -1086,7 -1086,7 +1086,7 @@@ out
   */
  static int __sctp_connect(struct sock *sk,
                          struct sockaddr *kaddrs,
 -                        int addrs_size,
 +                        int addrs_size, int flags,
                          sctp_assoc_t *assoc_id)
  {
        struct net *net = sock_net(sk);
        union sctp_addr *sa_addr = NULL;
        void *addr_buf;
        unsigned short port;
 -      unsigned int f_flags = 0;
  
        sp = sctp_sk(sk);
        ep = sp->ep;
        sp->pf->to_sk_daddr(sa_addr, sk);
        sk->sk_err = 0;
  
 -      /* in-kernel sockets don't generally have a file allocated to them
 -       * if all they do is call sock_create_kern().
 -       */
 -      if (sk->sk_socket->file)
 -              f_flags = sk->sk_socket->file->f_flags;
 -
 -      timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
 +      timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
  
        if (assoc_id)
                *assoc_id = asoc->assoc_id;
@@@ -1341,7 -1348,7 +1341,7 @@@ static int __sctp_setsockopt_connectx(s
                                      sctp_assoc_t *assoc_id)
  {
        struct sockaddr *kaddrs;
 -      int err = 0;
 +      int err = 0, flags = 0;
  
        pr_debug("%s: sk:%p addrs:%p addrs_size:%d\n",
                 __func__, sk, addrs, addrs_size);
        if (err)
                goto out_free;
  
 -      err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id);
 +      /* in-kernel sockets don't generally have a file allocated to them
 +       * if all they do is call sock_create_kern().
 +       */
 +      if (sk->sk_socket->file)
 +              flags = sk->sk_socket->file->f_flags;
 +
 +      err = __sctp_connect(sk, kaddrs, addrs_size, flags, assoc_id);
  
  out_free:
        kvfree(kaddrs);
@@@ -4396,26 -4397,16 +4396,26 @@@ out_nounlock
   * len: the size of the address.
   */
  static int sctp_connect(struct sock *sk, struct sockaddr *addr,
 -                      int addr_len)
 +                      int addr_len, int flags)
  {
 -      int err = 0;
 +      struct inet_sock *inet = inet_sk(sk);
        struct sctp_af *af;
 +      int err = 0;
  
        lock_sock(sk);
  
        pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk,
                 addr, addr_len);
  
 +      /* We may need to bind the socket. */
 +      if (!inet->inet_num) {
 +              if (sk->sk_prot->get_port(sk, 0)) {
 +                      release_sock(sk);
 +                      return -EAGAIN;
 +              }
 +              inet->inet_sport = htons(inet->inet_num);
 +      }
 +
        /* Validate addr_len before calling common connect/connectx routine. */
        af = sctp_get_af_specific(addr->sa_family);
        if (!af || addr_len < af->sockaddr_len) {
                /* Pass correct addr len to common routine (so it knows there
                 * is only one address being passed.
                 */
 -              err = __sctp_connect(sk, addr, af->sockaddr_len, NULL);
 +              err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL);
        }
  
        release_sock(sk);
        return err;
  }
  
 +int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
 +                    int addr_len, int flags)
 +{
 +      if (addr_len < sizeof(uaddr->sa_family))
 +              return -EINVAL;
 +
 +      if (uaddr->sa_family == AF_UNSPEC)
 +              return -EOPNOTSUPP;
 +
 +      return sctp_connect(sock->sk, uaddr, addr_len, flags);
 +}
 +
  /* FIXME: Write comments. */
  static int sctp_disconnect(struct sock *sk, int flags)
  {
   * here, again, by modeling the current TCP/UDP code.  We don't have
   * a good way to test with it yet.
   */
- __poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
+ __poll_t sctp_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct sctp_sock *sp = sctp_sk(sk);
        __poll_t mask;
  
-       poll_wait(file, sk_sleep(sk), wait);
        sock_rps_record_flow(sk);
  
        /* A TCP-style listening socket becomes readable when the accept queue
@@@ -8745,6 -8722,7 +8743,6 @@@ struct proto sctp_prot = 
        .name        =  "SCTP",
        .owner       =  THIS_MODULE,
        .close       =  sctp_close,
 -      .connect     =  sctp_connect,
        .disconnect  =  sctp_disconnect,
        .accept      =  sctp_accept,
        .ioctl       =  sctp_ioctl,
@@@ -8787,6 -8765,7 +8785,6 @@@ struct proto sctpv6_prot = 
        .name           = "SCTPv6",
        .owner          = THIS_MODULE,
        .close          = sctp_close,
 -      .connect        = sctp_connect,
        .disconnect     = sctp_disconnect,
        .accept         = sctp_accept,
        .ioctl          = sctp_ioctl,
diff --combined net/tipc/socket.c
@@@ -692,10 -692,9 +692,9 @@@ static int tipc_getname(struct socket *
  }
  
  /**
-  * tipc_poll - read and possibly block on pollmask
+  * tipc_poll - read pollmask
   * @file: file structure associated with the socket
   * @sock: socket for which to calculate the poll bits
-  * @wait: ???
   *
   * Returns pollmask value
   *
   * imply that the operation will succeed, merely that it should be performed
   * and will not block.
   */
- static __poll_t tipc_poll(struct file *file, struct socket *sock,
-                             poll_table *wait)
+ static __poll_t tipc_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
        struct tipc_sock *tsk = tipc_sk(sk);
        __poll_t revents = 0;
  
-       sock_poll_wait(file, sk_sleep(sk), wait);
        if (sk->sk_shutdown & RCV_SHUTDOWN)
                revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
        if (sk->sk_shutdown == SHUTDOWN_MASK)
@@@ -1516,10 -1512,10 +1512,10 @@@ static void tipc_sk_set_orig_addr(struc
  
        srcaddr->sock.family = AF_TIPC;
        srcaddr->sock.addrtype = TIPC_ADDR_ID;
 +      srcaddr->sock.scope = 0;
        srcaddr->sock.addr.id.ref = msg_origport(hdr);
        srcaddr->sock.addr.id.node = msg_orignode(hdr);
        srcaddr->sock.addr.name.domain = 0;
 -      srcaddr->sock.scope = 0;
        m->msg_namelen = sizeof(struct sockaddr_tipc);
  
        if (!msg_in_group(hdr))
        /* Group message users may also want to know sending member's id */
        srcaddr->member.family = AF_TIPC;
        srcaddr->member.addrtype = TIPC_ADDR_NAME;
 +      srcaddr->member.scope = 0;
        srcaddr->member.addr.name.name.type = msg_nametype(hdr);
        srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member;
        srcaddr->member.addr.name.domain = 0;
@@@ -3028,7 -3023,7 +3024,7 @@@ static const struct proto_ops msg_ops 
        .socketpair     = tipc_socketpair,
        .accept         = sock_no_accept,
        .getname        = tipc_getname,
-       .poll           = tipc_poll,
+       .poll_mask      = tipc_poll_mask,
        .ioctl          = tipc_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = tipc_shutdown,
@@@ -3049,7 -3044,7 +3045,7 @@@ static const struct proto_ops packet_op
        .socketpair     = tipc_socketpair,
        .accept         = tipc_accept,
        .getname        = tipc_getname,
-       .poll           = tipc_poll,
+       .poll_mask      = tipc_poll_mask,
        .ioctl          = tipc_ioctl,
        .listen         = tipc_listen,
        .shutdown       = tipc_shutdown,
@@@ -3070,7 -3065,7 +3066,7 @@@ static const struct proto_ops stream_op
        .socketpair     = tipc_socketpair,
        .accept         = tipc_accept,
        .getname        = tipc_getname,
-       .poll           = tipc_poll,
+       .poll_mask      = tipc_poll_mask,
        .ioctl          = tipc_ioctl,
        .listen         = tipc_listen,
        .shutdown       = tipc_shutdown,
diff --combined net/unix/af_unix.c
@@@ -638,9 -638,8 +638,8 @@@ static int unix_stream_connect(struct s
  static int unix_socketpair(struct socket *, struct socket *);
  static int unix_accept(struct socket *, struct socket *, int, bool);
  static int unix_getname(struct socket *, struct sockaddr *, int);
- static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
- static __poll_t unix_dgram_poll(struct file *, struct socket *,
-                                   poll_table *);
+ static __poll_t unix_poll_mask(struct socket *, __poll_t);
+ static __poll_t unix_dgram_poll_mask(struct socket *, __poll_t);
  static int unix_ioctl(struct socket *, unsigned int, unsigned long);
  static int unix_shutdown(struct socket *, int);
  static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
@@@ -681,7 -680,7 +680,7 @@@ static const struct proto_ops unix_stre
        .socketpair =   unix_socketpair,
        .accept =       unix_accept,
        .getname =      unix_getname,
-       .poll =         unix_poll,
+       .poll_mask =    unix_poll_mask,
        .ioctl =        unix_ioctl,
        .listen =       unix_listen,
        .shutdown =     unix_shutdown,
@@@ -704,7 -703,7 +703,7 @@@ static const struct proto_ops unix_dgra
        .socketpair =   unix_socketpair,
        .accept =       sock_no_accept,
        .getname =      unix_getname,
-       .poll =         unix_dgram_poll,
+       .poll_mask =    unix_dgram_poll_mask,
        .ioctl =        unix_ioctl,
        .listen =       sock_no_listen,
        .shutdown =     unix_shutdown,
@@@ -726,7 -725,7 +725,7 @@@ static const struct proto_ops unix_seqp
        .socketpair =   unix_socketpair,
        .accept =       unix_accept,
        .getname =      unix_getname,
-       .poll =         unix_dgram_poll,
+       .poll_mask =    unix_dgram_poll_mask,
        .ioctl =        unix_ioctl,
        .listen =       unix_listen,
        .shutdown =     unix_shutdown,
@@@ -2630,13 -2629,10 +2629,10 @@@ static int unix_ioctl(struct socket *so
        return err;
  }
  
- static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)
+ static __poll_t unix_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk;
-       __poll_t mask;
-       sock_poll_wait(file, sk_sleep(sk), wait);
-       mask = 0;
+       __poll_t mask = 0;
  
        /* exceptional events? */
        if (sk->sk_err)
        return mask;
  }
  
- static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
-                                   poll_table *wait)
+ static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events)
  {
        struct sock *sk = sock->sk, *other;
-       unsigned int writable;
-       __poll_t mask;
-       sock_poll_wait(file, sk_sleep(sk), wait);
-       mask = 0;
+       int writable;
+       __poll_t mask = 0;
  
        /* exceptional events? */
        if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
        }
  
        /* No write status requested, avoid expensive OUT tests. */
-       if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
+       if (!(events & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT)))
                return mask;
  
        writable = unix_writable(sk);
@@@ -2852,6 -2844,20 +2844,6 @@@ static const struct seq_operations unix
        .stop   = unix_seq_stop,
        .show   = unix_seq_show,
  };
 -
 -static int unix_seq_open(struct inode *inode, struct file *file)
 -{
 -      return seq_open_net(inode, file, &unix_seq_ops,
 -                          sizeof(struct seq_net_private));
 -}
 -
 -static const struct file_operations unix_seq_fops = {
 -      .open           = unix_seq_open,
 -      .read           = seq_read,
 -      .llseek         = seq_lseek,
 -      .release        = seq_release_net,
 -};
 -
  #endif
  
  static const struct net_proto_family unix_family_ops = {
@@@ -2870,8 -2876,7 +2862,8 @@@ static int __net_init unix_net_init(str
                goto out;
  
  #ifdef CONFIG_PROC_FS
 -      if (!proc_create("unix", 0, net->proc_net, &unix_seq_fops)) {
 +      if (!proc_create_net("unix", 0, net->proc_net, &unix_seq_ops,
 +                      sizeof(struct seq_net_private))) {
                unix_sysctl_unregister(net);
                goto out;
        }