diff options
Diffstat (limited to 'net/bluetooth/rfcomm/sock.c')
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 41 | 
1 files changed, 29 insertions, 12 deletions
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index ca87d6ac6a2..8ed3c37684f 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -40,6 +40,8 @@  #include <linux/skbuff.h>  #include <linux/list.h>  #include <linux/device.h> +#include <linux/debugfs.h> +#include <linux/seq_file.h>  #include <net/sock.h>  #include <asm/system.h> @@ -395,7 +397,8 @@ static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int a  	BT_DBG("sk %p", sk); -	if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc)) +	if (alen < sizeof(struct sockaddr_rc) || +	    addr->sa_family != AF_BLUETOOTH)  		return -EINVAL;  	lock_sock(sk); @@ -1061,28 +1064,38 @@ done:  	return result;  } -static ssize_t rfcomm_sock_sysfs_show(struct class *dev, -				      struct class_attribute *attr, -				      char *buf) +static int rfcomm_sock_debugfs_show(struct seq_file *f, void *p)  {  	struct sock *sk;  	struct hlist_node *node; -	char *str = buf;  	read_lock_bh(&rfcomm_sk_list.lock);  	sk_for_each(sk, node, &rfcomm_sk_list.head) { -		str += sprintf(str, "%s %s %d %d\n", -				batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), +		seq_printf(f, "%s %s %d %d\n", +				batostr(&bt_sk(sk)->src), +				batostr(&bt_sk(sk)->dst),  				sk->sk_state, rfcomm_pi(sk)->channel);  	}  	read_unlock_bh(&rfcomm_sk_list.lock); -	return (str - buf); +	return 0;  } -static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL); +static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file) +{ +	return single_open(file, rfcomm_sock_debugfs_show, inode->i_private); +} + +static const struct file_operations rfcomm_sock_debugfs_fops = { +	.open		= rfcomm_sock_debugfs_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; + +static struct dentry *rfcomm_sock_debugfs;  static const struct proto_ops rfcomm_sock_ops = {  	.family		= PF_BLUETOOTH, @@ -1122,8 +1135,12 @@ int __init rfcomm_init_sockets(void)  	if (err < 0)  		goto error; -	if (class_create_file(bt_class, &class_attr_rfcomm) < 0) -		BT_ERR("Failed to create RFCOMM info file"); +	if (bt_debugfs) { +		rfcomm_sock_debugfs = debugfs_create_file("rfcomm", 0444, +				bt_debugfs, NULL, &rfcomm_sock_debugfs_fops); +		if (!rfcomm_sock_debugfs) +			BT_ERR("Failed to create RFCOMM debug file"); +	}  	BT_INFO("RFCOMM socket layer initialized"); @@ -1137,7 +1154,7 @@ error:  void rfcomm_cleanup_sockets(void)  { -	class_remove_file(bt_class, &class_attr_rfcomm); +	debugfs_remove(rfcomm_sock_debugfs);  	if (bt_sock_unregister(BTPROTO_RFCOMM) < 0)  		BT_ERR("RFCOMM socket layer unregistration failed");  |