Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1429 commits) net: Allow dependancies of FDDI & Tokenring to be modular. igb: Fix build warning when DCA is disabled. net: Fix warning fallout from recent NAPI interface changes. gro: Fix potential use after free sfc: If AN is enabled, always read speed/duplex from the AN advertising bits sfc: When disabling the NIC, close the device rather than unregistering it sfc: SFT9001: Add cable diagnostics sfc: Add support for multiple PHY self-tests sfc: Merge top-level functions for self-tests sfc: Clean up PHY mode management in loopback self-test sfc: Fix unreliable link detection in some loopback modes sfc: Generate unique names for per-NIC workqueues 802.3ad: use standard ethhdr instead of ad_header 802.3ad: generalize out mac address initializer 802.3ad: initialize ports LACPDU from const initializer 802.3ad: remove typedef around ad_system 802.3ad: turn ports is_individual into a bool 802.3ad: turn ports is_enabled into a bool 802.3ad: make ntt bool ixgbe: Fix set_ringparam in ixgbe to use the same memory pools. ... Fixed trivial IPv4/6 address printing conflicts in fs/cifs/connect.c due to the conversion to %pI (in this networking merge) and the addition of doing IPv6 addresses (from the earlier merge of CIFS).
This commit is contained in:
@@ -164,7 +164,7 @@ static inline int unix_our_peer(struct sock *sk, struct sock *osk)
|
||||
|
||||
static inline int unix_may_send(struct sock *sk, struct sock *osk)
|
||||
{
|
||||
return (unix_peer(osk) == NULL || unix_our_peer(sk, osk));
|
||||
return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
|
||||
}
|
||||
|
||||
static inline int unix_recvq_full(struct sock const *sk)
|
||||
@@ -197,7 +197,7 @@ static inline void unix_release_addr(struct unix_address *addr)
|
||||
* - if started by zero, it is abstract name.
|
||||
*/
|
||||
|
||||
static int unix_mkname(struct sockaddr_un * sunaddr, int len, unsigned *hashp)
|
||||
static int unix_mkname(struct sockaddr_un *sunaddr, int len, unsigned *hashp)
|
||||
{
|
||||
if (len <= sizeof(short) || len > sizeof(*sunaddr))
|
||||
return -EINVAL;
|
||||
@@ -211,12 +211,12 @@ static int unix_mkname(struct sockaddr_un * sunaddr, int len, unsigned *hashp)
|
||||
* we are guaranteed that it is a valid memory location in our
|
||||
* kernel address buffer.
|
||||
*/
|
||||
((char *)sunaddr)[len]=0;
|
||||
((char *)sunaddr)[len] = 0;
|
||||
len = strlen(sunaddr->sun_path)+1+sizeof(short);
|
||||
return len;
|
||||
}
|
||||
|
||||
*hashp = unix_hash_fold(csum_partial((char*)sunaddr, len, 0));
|
||||
*hashp = unix_hash_fold(csum_partial(sunaddr, len, 0));
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -295,8 +295,7 @@ static struct sock *unix_find_socket_byinode(struct net *net, struct inode *i)
|
||||
if (!net_eq(sock_net(s), net))
|
||||
continue;
|
||||
|
||||
if(dentry && dentry->d_inode == i)
|
||||
{
|
||||
if (dentry && dentry->d_inode == i) {
|
||||
sock_hold(s);
|
||||
goto found;
|
||||
}
|
||||
@@ -354,7 +353,7 @@ static void unix_sock_destructor(struct sock *sk)
|
||||
WARN_ON(!sk_unhashed(sk));
|
||||
WARN_ON(sk->sk_socket);
|
||||
if (!sock_flag(sk, SOCK_DEAD)) {
|
||||
printk("Attempt to release alive unix socket: %p\n", sk);
|
||||
printk(KERN_INFO "Attempt to release alive unix socket: %p\n", sk);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -362,12 +361,16 @@ static void unix_sock_destructor(struct sock *sk)
|
||||
unix_release_addr(u->addr);
|
||||
|
||||
atomic_dec(&unix_nr_socks);
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
|
||||
local_bh_enable();
|
||||
#ifdef UNIX_REFCNT_DEBUG
|
||||
printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk, atomic_read(&unix_nr_socks));
|
||||
printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk,
|
||||
atomic_read(&unix_nr_socks));
|
||||
#endif
|
||||
}
|
||||
|
||||
static int unix_release_sock (struct sock *sk, int embrion)
|
||||
static int unix_release_sock(struct sock *sk, int embrion)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
struct dentry *dentry;
|
||||
@@ -392,9 +395,9 @@ static int unix_release_sock (struct sock *sk, int embrion)
|
||||
|
||||
wake_up_interruptible_all(&u->peer_wait);
|
||||
|
||||
skpair=unix_peer(sk);
|
||||
skpair = unix_peer(sk);
|
||||
|
||||
if (skpair!=NULL) {
|
||||
if (skpair != NULL) {
|
||||
if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
|
||||
unix_state_lock(skpair);
|
||||
/* No more writes */
|
||||
@@ -414,7 +417,7 @@ static int unix_release_sock (struct sock *sk, int embrion)
|
||||
/* Try to flush out this socket. Throw out buffers at least */
|
||||
|
||||
while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
|
||||
if (state==TCP_LISTEN)
|
||||
if (state == TCP_LISTEN)
|
||||
unix_release_sock(skb->sk, 1);
|
||||
/* passed fds are erased in the kfree_skb hook */
|
||||
kfree_skb(skb);
|
||||
@@ -453,11 +456,11 @@ static int unix_listen(struct socket *sock, int backlog)
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
|
||||
err = -EOPNOTSUPP;
|
||||
if (sock->type!=SOCK_STREAM && sock->type!=SOCK_SEQPACKET)
|
||||
goto out; /* Only stream/seqpacket sockets accept */
|
||||
if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
|
||||
goto out; /* Only stream/seqpacket sockets accept */
|
||||
err = -EINVAL;
|
||||
if (!u->addr)
|
||||
goto out; /* No listens on an unbound socket */
|
||||
goto out; /* No listens on an unbound socket */
|
||||
unix_state_lock(sk);
|
||||
if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
|
||||
goto out_unlock;
|
||||
@@ -565,9 +568,9 @@ static const struct proto_ops unix_seqpacket_ops = {
|
||||
};
|
||||
|
||||
static struct proto unix_proto = {
|
||||
.name = "UNIX",
|
||||
.owner = THIS_MODULE,
|
||||
.obj_size = sizeof(struct unix_sock),
|
||||
.name = "UNIX",
|
||||
.owner = THIS_MODULE,
|
||||
.obj_size = sizeof(struct unix_sock),
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -578,7 +581,7 @@ static struct proto unix_proto = {
|
||||
*/
|
||||
static struct lock_class_key af_unix_sk_receive_queue_lock_key;
|
||||
|
||||
static struct sock * unix_create1(struct net *net, struct socket *sock)
|
||||
static struct sock *unix_create1(struct net *net, struct socket *sock)
|
||||
{
|
||||
struct sock *sk = NULL;
|
||||
struct unix_sock *u;
|
||||
@@ -591,7 +594,7 @@ static struct sock * unix_create1(struct net *net, struct socket *sock)
|
||||
if (!sk)
|
||||
goto out;
|
||||
|
||||
sock_init_data(sock,sk);
|
||||
sock_init_data(sock, sk);
|
||||
lockdep_set_class(&sk->sk_receive_queue.lock,
|
||||
&af_unix_sk_receive_queue_lock_key);
|
||||
|
||||
@@ -610,6 +613,11 @@ static struct sock * unix_create1(struct net *net, struct socket *sock)
|
||||
out:
|
||||
if (sk == NULL)
|
||||
atomic_dec(&unix_nr_socks);
|
||||
else {
|
||||
local_bh_disable();
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
local_bh_enable();
|
||||
}
|
||||
return sk;
|
||||
}
|
||||
|
||||
@@ -629,7 +637,7 @@ static int unix_create(struct net *net, struct socket *sock, int protocol)
|
||||
* nothing uses it.
|
||||
*/
|
||||
case SOCK_RAW:
|
||||
sock->type=SOCK_DGRAM;
|
||||
sock->type = SOCK_DGRAM;
|
||||
case SOCK_DGRAM:
|
||||
sock->ops = &unix_dgram_ops;
|
||||
break;
|
||||
@@ -652,7 +660,7 @@ static int unix_release(struct socket *sock)
|
||||
|
||||
sock->sk = NULL;
|
||||
|
||||
return unix_release_sock (sk, 0);
|
||||
return unix_release_sock(sk, 0);
|
||||
}
|
||||
|
||||
static int unix_autobind(struct socket *sock)
|
||||
@@ -661,7 +669,7 @@ static int unix_autobind(struct socket *sock)
|
||||
struct net *net = sock_net(sk);
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
static u32 ordernum = 1;
|
||||
struct unix_address * addr;
|
||||
struct unix_address *addr;
|
||||
int err;
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
@@ -680,7 +688,7 @@ static int unix_autobind(struct socket *sock)
|
||||
|
||||
retry:
|
||||
addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
|
||||
addr->hash = unix_hash_fold(csum_partial((void*)addr->name, addr->len, 0));
|
||||
addr->hash = unix_hash_fold(csum_partial(addr->name, addr->len, 0));
|
||||
|
||||
spin_lock(&unix_table_lock);
|
||||
ordernum = (ordernum+1)&0xFFFFF;
|
||||
@@ -735,14 +743,14 @@ static struct sock *unix_find_other(struct net *net,
|
||||
|
||||
path_put(&path);
|
||||
|
||||
err=-EPROTOTYPE;
|
||||
err = -EPROTOTYPE;
|
||||
if (u->sk_type != type) {
|
||||
sock_put(u);
|
||||
goto fail;
|
||||
}
|
||||
} else {
|
||||
err = -ECONNREFUSED;
|
||||
u=unix_find_socket_byname(net, sunname, len, type, hash);
|
||||
u = unix_find_socket_byname(net, sunname, len, type, hash);
|
||||
if (u) {
|
||||
struct dentry *dentry;
|
||||
dentry = unix_sk(u)->dentry;
|
||||
@@ -756,7 +764,7 @@ static struct sock *unix_find_other(struct net *net,
|
||||
put_fail:
|
||||
path_put(&path);
|
||||
fail:
|
||||
*error=err;
|
||||
*error = err;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -766,8 +774,8 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
|
||||
struct dentry * dentry = NULL;
|
||||
struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
|
||||
struct dentry *dentry = NULL;
|
||||
struct nameidata nd;
|
||||
int err;
|
||||
unsigned hash;
|
||||
@@ -778,7 +786,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
if (sunaddr->sun_family != AF_UNIX)
|
||||
goto out;
|
||||
|
||||
if (addr_len==sizeof(short)) {
|
||||
if (addr_len == sizeof(short)) {
|
||||
err = unix_autobind(sock);
|
||||
goto out;
|
||||
}
|
||||
@@ -874,8 +882,8 @@ out_mknod_unlock:
|
||||
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
|
||||
path_put(&nd.path);
|
||||
out_mknod_parent:
|
||||
if (err==-EEXIST)
|
||||
err=-EADDRINUSE;
|
||||
if (err == -EEXIST)
|
||||
err = -EADDRINUSE;
|
||||
unix_release_addr(addr);
|
||||
goto out_up;
|
||||
}
|
||||
@@ -910,7 +918,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct sockaddr_un *sunaddr=(struct sockaddr_un*)addr;
|
||||
struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;
|
||||
struct sock *other;
|
||||
unsigned hash;
|
||||
int err;
|
||||
@@ -926,7 +934,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
|
||||
goto out;
|
||||
|
||||
restart:
|
||||
other=unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
|
||||
other = unix_find_other(net, sunaddr, alen, sock->type, hash, &err);
|
||||
if (!other)
|
||||
goto out;
|
||||
|
||||
@@ -960,14 +968,14 @@ restart:
|
||||
*/
|
||||
if (unix_peer(sk)) {
|
||||
struct sock *old_peer = unix_peer(sk);
|
||||
unix_peer(sk)=other;
|
||||
unix_peer(sk) = other;
|
||||
unix_state_double_unlock(sk, other);
|
||||
|
||||
if (other != old_peer)
|
||||
unix_dgram_disconnected(sk, old_peer);
|
||||
sock_put(old_peer);
|
||||
} else {
|
||||
unix_peer(sk)=other;
|
||||
unix_peer(sk) = other;
|
||||
unix_state_double_unlock(sk, other);
|
||||
}
|
||||
return 0;
|
||||
@@ -1003,7 +1011,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo)
|
||||
static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
||||
int addr_len, int flags)
|
||||
{
|
||||
struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
|
||||
struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct unix_sock *u = unix_sk(sk), *newu, *otheru;
|
||||
@@ -1177,13 +1185,13 @@ out:
|
||||
|
||||
static int unix_socketpair(struct socket *socka, struct socket *sockb)
|
||||
{
|
||||
struct sock *ska=socka->sk, *skb = sockb->sk;
|
||||
struct sock *ska = socka->sk, *skb = sockb->sk;
|
||||
|
||||
/* Join our sockets back to back */
|
||||
sock_hold(ska);
|
||||
sock_hold(skb);
|
||||
unix_peer(ska)=skb;
|
||||
unix_peer(skb)=ska;
|
||||
unix_peer(ska) = skb;
|
||||
unix_peer(skb) = ska;
|
||||
ska->sk_peercred.pid = skb->sk_peercred.pid = task_tgid_vnr(current);
|
||||
current_euid_egid(&skb->sk_peercred.uid, &skb->sk_peercred.gid);
|
||||
ska->sk_peercred.uid = skb->sk_peercred.uid;
|
||||
@@ -1206,7 +1214,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
int err;
|
||||
|
||||
err = -EOPNOTSUPP;
|
||||
if (sock->type!=SOCK_STREAM && sock->type!=SOCK_SEQPACKET)
|
||||
if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
|
||||
goto out;
|
||||
|
||||
err = -EINVAL;
|
||||
@@ -1245,7 +1253,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct unix_sock *u;
|
||||
struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
|
||||
struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
|
||||
int err = 0;
|
||||
|
||||
if (peer) {
|
||||
@@ -1285,7 +1293,7 @@ static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
skb->destructor = sock_wfree;
|
||||
UNIXCB(skb).fp = NULL;
|
||||
|
||||
for (i=scm->fp->count-1; i>=0; i--)
|
||||
for (i = scm->fp->count-1; i >= 0; i--)
|
||||
unix_notinflight(scm->fp->fp[i]);
|
||||
}
|
||||
|
||||
@@ -1314,7 +1322,7 @@ static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
if (!UNIXCB(skb).fp)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i=scm->fp->count-1; i>=0; i--)
|
||||
for (i = scm->fp->count-1; i >= 0; i--)
|
||||
unix_inflight(scm->fp->fp[i]);
|
||||
skb->destructor = unix_destruct_fds;
|
||||
return 0;
|
||||
@@ -1331,7 +1339,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
struct sockaddr_un *sunaddr=msg->msg_name;
|
||||
struct sockaddr_un *sunaddr = msg->msg_name;
|
||||
struct sock *other = NULL;
|
||||
int namelen = 0; /* fake GCC */
|
||||
int err;
|
||||
@@ -1373,7 +1381,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
goto out;
|
||||
|
||||
skb = sock_alloc_send_skb(sk, len, msg->msg_flags&MSG_DONTWAIT, &err);
|
||||
if (skb==NULL)
|
||||
if (skb == NULL)
|
||||
goto out;
|
||||
|
||||
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
|
||||
@@ -1385,7 +1393,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
unix_get_secdata(siocb->scm, skb);
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
|
||||
err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
@@ -1399,7 +1407,7 @@ restart:
|
||||
|
||||
other = unix_find_other(net, sunaddr, namelen, sk->sk_type,
|
||||
hash, &err);
|
||||
if (other==NULL)
|
||||
if (other == NULL)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -1419,7 +1427,7 @@ restart:
|
||||
err = 0;
|
||||
unix_state_lock(sk);
|
||||
if (unix_peer(sk) == other) {
|
||||
unix_peer(sk)=NULL;
|
||||
unix_peer(sk) = NULL;
|
||||
unix_state_unlock(sk);
|
||||
|
||||
unix_dgram_disconnected(sk, other);
|
||||
@@ -1485,10 +1493,10 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
|
||||
struct sock *sk = sock->sk;
|
||||
struct sock *other = NULL;
|
||||
struct sockaddr_un *sunaddr=msg->msg_name;
|
||||
int err,size;
|
||||
struct sockaddr_un *sunaddr = msg->msg_name;
|
||||
int err, size;
|
||||
struct sk_buff *skb;
|
||||
int sent=0;
|
||||
int sent = 0;
|
||||
struct scm_cookie tmp_scm;
|
||||
|
||||
if (NULL == siocb->scm)
|
||||
@@ -1516,8 +1524,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
if (sk->sk_shutdown & SEND_SHUTDOWN)
|
||||
goto pipe_err;
|
||||
|
||||
while(sent < len)
|
||||
{
|
||||
while (sent < len) {
|
||||
/*
|
||||
* Optimisation for the fact that under 0.01% of X
|
||||
* messages typically need breaking up.
|
||||
@@ -1536,9 +1543,10 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
* Grab a buffer
|
||||
*/
|
||||
|
||||
skb=sock_alloc_send_skb(sk,size,msg->msg_flags&MSG_DONTWAIT, &err);
|
||||
skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT,
|
||||
&err);
|
||||
|
||||
if (skb==NULL)
|
||||
if (skb == NULL)
|
||||
goto out_err;
|
||||
|
||||
/*
|
||||
@@ -1559,7 +1567,8 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
}
|
||||
}
|
||||
|
||||
if ((err = memcpy_fromiovec(skb_put(skb,size), msg->msg_iov, size)) != 0) {
|
||||
err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
|
||||
if (err) {
|
||||
kfree_skb(skb);
|
||||
goto out_err;
|
||||
}
|
||||
@@ -1573,7 +1582,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
unix_state_unlock(other);
|
||||
other->sk_data_ready(other, size);
|
||||
sent+=size;
|
||||
sent += size;
|
||||
}
|
||||
|
||||
scm_destroy(siocb->scm);
|
||||
@@ -1585,8 +1594,8 @@ pipe_err_free:
|
||||
unix_state_unlock(other);
|
||||
kfree_skb(skb);
|
||||
pipe_err:
|
||||
if (sent==0 && !(msg->msg_flags&MSG_NOSIGNAL))
|
||||
send_sig(SIGPIPE,current,0);
|
||||
if (sent == 0 && !(msg->msg_flags&MSG_NOSIGNAL))
|
||||
send_sig(SIGPIPE, current, 0);
|
||||
err = -EPIPE;
|
||||
out_err:
|
||||
scm_destroy(siocb->scm);
|
||||
@@ -1676,13 +1685,10 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
siocb->scm->creds = *UNIXCREDS(skb);
|
||||
unix_set_secdata(siocb->scm, skb);
|
||||
|
||||
if (!(flags & MSG_PEEK))
|
||||
{
|
||||
if (!(flags & MSG_PEEK)) {
|
||||
if (UNIXCB(skb).fp)
|
||||
unix_detach_fds(siocb->scm, skb);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
/* It is questionable: on PEEK we could:
|
||||
- do not return fds - good, but too simple 8)
|
||||
- return fds, and do not return them on read (old strategy,
|
||||
@@ -1703,7 +1709,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
scm_recv(sock, msg, siocb->scm, flags);
|
||||
|
||||
out_free:
|
||||
skb_free_datagram(sk,skb);
|
||||
skb_free_datagram(sk, skb);
|
||||
out_unlock:
|
||||
mutex_unlock(&u->readlock);
|
||||
out:
|
||||
@@ -1714,7 +1720,7 @@ out:
|
||||
* Sleep until data has arrive. But check for races..
|
||||
*/
|
||||
|
||||
static long unix_stream_data_wait(struct sock * sk, long timeo)
|
||||
static long unix_stream_data_wait(struct sock *sk, long timeo)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
@@ -1752,7 +1758,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct scm_cookie tmp_scm;
|
||||
struct sock *sk = sock->sk;
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
struct sockaddr_un *sunaddr=msg->msg_name;
|
||||
struct sockaddr_un *sunaddr = msg->msg_name;
|
||||
int copied = 0;
|
||||
int check_creds = 0;
|
||||
int target;
|
||||
@@ -1783,15 +1789,13 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
|
||||
do
|
||||
{
|
||||
do {
|
||||
int chunk;
|
||||
struct sk_buff *skb;
|
||||
|
||||
unix_state_lock(sk);
|
||||
skb = skb_dequeue(&sk->sk_receive_queue);
|
||||
if (skb==NULL)
|
||||
{
|
||||
if (skb == NULL) {
|
||||
if (copied >= target)
|
||||
goto unlock;
|
||||
|
||||
@@ -1799,7 +1803,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
* POSIX 1003.1g mandates this order.
|
||||
*/
|
||||
|
||||
if ((err = sock_error(sk)) != 0)
|
||||
err = sock_error(sk);
|
||||
if (err)
|
||||
goto unlock;
|
||||
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
||||
goto unlock;
|
||||
@@ -1826,7 +1831,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
||||
if (check_creds) {
|
||||
/* Never glue messages from different writers */
|
||||
if (memcmp(UNIXCREDS(skb), &siocb->scm->creds, sizeof(siocb->scm->creds)) != 0) {
|
||||
if (memcmp(UNIXCREDS(skb), &siocb->scm->creds,
|
||||
sizeof(siocb->scm->creds)) != 0) {
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
break;
|
||||
}
|
||||
@@ -1837,8 +1843,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
}
|
||||
|
||||
/* Copy address just once */
|
||||
if (sunaddr)
|
||||
{
|
||||
if (sunaddr) {
|
||||
unix_copy_addr(msg, skb->sk);
|
||||
sunaddr = NULL;
|
||||
}
|
||||
@@ -1854,16 +1859,14 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
size -= chunk;
|
||||
|
||||
/* Mark read part of skb as used */
|
||||
if (!(flags & MSG_PEEK))
|
||||
{
|
||||
if (!(flags & MSG_PEEK)) {
|
||||
skb_pull(skb, chunk);
|
||||
|
||||
if (UNIXCB(skb).fp)
|
||||
unix_detach_fds(siocb->scm, skb);
|
||||
|
||||
/* put the skb back if we didn't use it up.. */
|
||||
if (skb->len)
|
||||
{
|
||||
if (skb->len) {
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
break;
|
||||
}
|
||||
@@ -1872,9 +1875,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
||||
if (siocb->scm->fp)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
/* It is questionable, see note in unix_dgram_recvmsg.
|
||||
*/
|
||||
if (UNIXCB(skb).fp)
|
||||
@@ -1902,7 +1903,7 @@ static int unix_shutdown(struct socket *sock, int mode)
|
||||
if (mode) {
|
||||
unix_state_lock(sk);
|
||||
sk->sk_shutdown |= mode;
|
||||
other=unix_peer(sk);
|
||||
other = unix_peer(sk);
|
||||
if (other)
|
||||
sock_hold(other);
|
||||
unix_state_unlock(sk);
|
||||
@@ -1937,16 +1938,15 @@ static int unix_shutdown(struct socket *sock, int mode)
|
||||
static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
long amount=0;
|
||||
long amount = 0;
|
||||
int err;
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case SIOCOUTQ:
|
||||
amount = atomic_read(&sk->sk_wmem_alloc);
|
||||
err = put_user(amount, (int __user *)arg);
|
||||
break;
|
||||
case SIOCINQ:
|
||||
switch (cmd) {
|
||||
case SIOCOUTQ:
|
||||
amount = atomic_read(&sk->sk_wmem_alloc);
|
||||
err = put_user(amount, (int __user *)arg);
|
||||
break;
|
||||
case SIOCINQ:
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
@@ -1963,21 +1963,21 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
} else {
|
||||
skb = skb_peek(&sk->sk_receive_queue);
|
||||
if (skb)
|
||||
amount=skb->len;
|
||||
amount = skb->len;
|
||||
}
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
err = put_user(amount, (int __user *)arg);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
err = -ENOIOCTLCMD;
|
||||
break;
|
||||
default:
|
||||
err = -ENOIOCTLCMD;
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static unsigned int unix_poll(struct file * file, struct socket *sock, poll_table *wait)
|
||||
static unsigned int unix_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
unsigned int mask;
|
||||
@@ -1999,7 +1999,8 @@ static unsigned int unix_poll(struct file * file, struct socket *sock, poll_tabl
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
||||
/* Connection-based need to check for termination and startup */
|
||||
if ((sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) && sk->sk_state == TCP_CLOSE)
|
||||
if ((sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) &&
|
||||
sk->sk_state == TCP_CLOSE)
|
||||
mask |= POLLHUP;
|
||||
|
||||
/*
|
||||
@@ -2095,6 +2096,7 @@ struct unix_iter_state {
|
||||
struct seq_net_private p;
|
||||
int i;
|
||||
};
|
||||
|
||||
static struct sock *unix_seq_idx(struct seq_file *seq, loff_t pos)
|
||||
{
|
||||
struct unix_iter_state *iter = seq->private;
|
||||
@@ -2111,7 +2113,6 @@ static struct sock *unix_seq_idx(struct seq_file *seq, loff_t pos)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(unix_table_lock)
|
||||
{
|
||||
@@ -2191,7 +2192,6 @@ static const struct seq_operations unix_seq_ops = {
|
||||
.show = unix_seq_show,
|
||||
};
|
||||
|
||||
|
||||
static int unix_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open_net(inode, file, &unix_seq_ops,
|
||||
|
Reference in New Issue
Block a user