/*
 * tcp_diag.c	Module for monitoring TCP transport protocols sockets.
 *
 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 *
 *	This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License
 *      as published by the Free Software Foundation; either version
 *      2 of the License, or (at your option) any later version.
 */

#include <linux/module.h>
#include <linux/net.h>
#include <linux/sock_diag.h>
#include <linux/inet_diag.h>

#include <linux/tcp.h>

#include <net/tcp.h>

static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
			      void *_info)
{
	struct tcp_info *info = _info;

	if (sk_state_load(sk) == TCP_LISTEN) {
		r->idiag_rqueue = sk->sk_ack_backlog;
		r->idiag_wqueue = sk->sk_max_ack_backlog;
	} else if (sk->sk_type == SOCK_STREAM) {
		const struct tcp_sock *tp = tcp_sk(sk);

		r->idiag_rqueue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0);
		r->idiag_wqueue = tp->write_seq - tp->snd_una;
	}
	if (info)
		tcp_get_info(sk, info);
}

static void tcp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
			  const struct inet_diag_req_v2 *r, struct nlattr *bc)
{
	inet_diag_dump_icsk(&tcp_hashinfo, skb, cb, r, bc);
}

static int tcp_diag_dump_one(struct sk_buff *in_skb, const struct nlmsghdr *nlh,
			     const struct inet_diag_req_v2 *req)
{
	return inet_diag_dump_one_icsk(&tcp_hashinfo, in_skb, nlh, req);
}

#ifdef CONFIG_INET_DIAG_DESTROY
static int tcp_diag_destroy(struct sk_buff *in_skb,
			    const struct inet_diag_req_v2 *req)
{
	struct net *net = sock_net(in_skb->sk);
	struct sock *sk = inet_diag_find_one_icsk(net, &tcp_hashinfo, req);
	int err;

	if (IS_ERR(sk))
		return PTR_ERR(sk);

	err = sock_diag_destroy(sk, ECONNABORTED);

	sock_gen_put(sk);

	return err;
}
#endif

static const struct inet_diag_handler tcp_diag_handler = {
	.dump		 = tcp_diag_dump,
	.dump_one	 = tcp_diag_dump_one,
	.idiag_get_info	 = tcp_diag_get_info,
	.idiag_type	 = IPPROTO_TCP,
	.idiag_info_size = sizeof(struct tcp_info),
#ifdef CONFIG_INET_DIAG_DESTROY
	.destroy	 = tcp_diag_destroy,
#endif
};

static int __init tcp_diag_init(void)
{
	return inet_diag_register(&tcp_diag_handler);
}

static void __exit tcp_diag_exit(void)
{
	inet_diag_unregister(&tcp_diag_handler);
}

module_init(tcp_diag_init);
module_exit(tcp_diag_exit);
MODULE_LICENSE("GPL");
MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2-6 /* AF_INET - IPPROTO_TCP */);
ption value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/commit/?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>root</a>/<a href='/cgit.cgi/linux/net-next.git/commit/sound?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>sound</a>/<a href='/cgit.cgi/linux/net-next.git/commit/sound/core?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>core</a>/<a href='/cgit.cgi/linux/net-next.git/commit/sound/core/seq?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>seq</a>/<a href='/cgit.cgi/linux/net-next.git/commit/sound/core/seq/seq_midi_event.c?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>seq_midi_event.c</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='eeeefd41843218c55a8782a6920f044d9bf6207a'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Christoph Hellwig &lt;hch@lst.de&gt;</td><td class='right'>2017-02-05 18:10:35 +0100</td></tr>
<tr><th>committer</th><td>Jens Axboe &lt;axboe@fb.com&gt;</td><td class='right'>2017-02-06 09:34:46 -0700</td></tr>
<tr><th>commit</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/sound/core/seq/seq_midi_event.c?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>eeeefd41843218c55a8782a6920f044d9bf6207a</a> (<a href='/cgit.cgi/linux/net-next.git/patch/sound/core/seq/seq_midi_event.c?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/tree/?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>c342eac46626e62745aa8e1a982626efca8b121d</a> /<a href='/cgit.cgi/linux/net-next.git/tree/sound/core/seq/seq_midi_event.c?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>sound/core/seq/seq_midi_event.c</a></td></tr>
<tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/sound/core/seq/seq_midi_event.c?id=c14024dbb156c8392908aaa822097d27c6af8ec8'>c14024dbb156c8392908aaa822097d27c6af8ec8</a> (<a href='/cgit.cgi/linux/net-next.git/diff/sound/core/seq/seq_midi_event.c?id=eeeefd41843218c55a8782a6920f044d9bf6207a&amp;id2=c14024dbb156c8392908aaa822097d27c6af8ec8'>diff</a>)</td></tr></table>
<div class='commit-subject'>block: don't try Write Same from __blkdev_issue_zeroout</div><div class='commit-msg'>Write Same can return an error asynchronously if it turns out the
underlying SCSI device does not support Write Same, which makes a
proper fallback to other methods in __blkdev_issue_zeroout impossible.
Thus only issue a Write Same from blkdev_issue_zeroout an don't try it
at all from __blkdev_issue_zeroout as a non-invasive workaround.

Signed-off-by: Christoph Hellwig &lt;hch@lst.de&gt;
Reported-by: Junichi Nomura &lt;j-nomura@ce.jp.nec.com&gt;
Fixes: e73c23ff ("block: add async variant of blkdev_issue_zeroout")
Tested-by: Junichi Nomura &lt;j-nomura@ce.jp.nec.com&gt;
Signed-off-by: Jens Axboe &lt;axboe@fb.com&gt;
</div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=eeeefd41843218c55a8782a6920f044d9bf6207a'>Diffstat</a> (limited to 'sound/core/seq/seq_midi_event.c')</div><table summary='diffstat' class='diffstat'>