diff options
Diffstat (limited to 'fs/afs/proc.c')
| -rw-r--r-- | fs/afs/proc.c | 102 | 
1 files changed, 84 insertions, 18 deletions
diff --git a/fs/afs/proc.c b/fs/afs/proc.c index 2a0c83d71565..3bd02571f30d 100644 --- a/fs/afs/proc.c +++ b/fs/afs/proc.c @@ -147,6 +147,55 @@ inval:  }  /* + * Display the list of addr_prefs known to the namespace. + */ +static int afs_proc_addr_prefs_show(struct seq_file *m, void *v) +{ +	struct afs_addr_preference_list *preflist; +	struct afs_addr_preference *pref; +	struct afs_net *net = afs_seq2net_single(m); +	union { +		struct sockaddr_in sin; +		struct sockaddr_in6 sin6; +	} addr; +	unsigned int i; +	char buf[44]; /* Maximum ipv6 + max subnet is 43 */ + +	rcu_read_lock(); +	preflist = rcu_dereference(net->address_prefs); + +	if (!preflist) { +		seq_puts(m, "NO PREFS\n"); +		return 0; +	} + +	seq_printf(m, "PROT SUBNET                                      PRIOR (v=%u n=%u/%u/%u)\n", +		   preflist->version, preflist->ipv6_off, preflist->nr, preflist->max_prefs); + +	memset(&addr, 0, sizeof(addr)); + +	for (i = 0; i < preflist->nr; i++) { +		pref = &preflist->prefs[i]; + +		addr.sin.sin_family = pref->family; +		if (pref->family == AF_INET) { +			memcpy(&addr.sin.sin_addr, &pref->ipv4_addr, +			       sizeof(addr.sin.sin_addr)); +			snprintf(buf, sizeof(buf), "%pISc/%u", &addr.sin, pref->subnet_mask); +			seq_printf(m, "UDP  %-43.43s %5u\n", buf, pref->prio); +		} else { +			memcpy(&addr.sin6.sin6_addr, &pref->ipv6_addr, +			       sizeof(addr.sin6.sin6_addr)); +			snprintf(buf, sizeof(buf), "%pISc/%u", &addr.sin6, pref->subnet_mask); +			seq_printf(m, "UDP  %-43.43s %5u\n", buf, pref->prio); +		} +	} + +	rcu_read_lock(); +	return 0; +} + +/*   * Display the name of the current workstation cell.   */  static int afs_proc_rootcell_show(struct seq_file *m, void *v) @@ -307,7 +356,7 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)  		for (i = 0; i < alist->nr_addrs; i++)  			seq_printf(m, " %c %pISpc\n",  				   alist->preferred == i ? '>' : '-', -				   &alist->addrs[i].transport); +				   rxrpc_kernel_remote_addr(alist->addrs[i].peer));  	}  	seq_printf(m, " info: fl=%lx rtt=%d\n", vlserver->flags, vlserver->rtt);  	seq_printf(m, " probe: fl=%x e=%d ac=%d out=%d\n", @@ -375,32 +424,45 @@ static const struct seq_operations afs_proc_cell_vlservers_ops = {   */  static int afs_proc_servers_show(struct seq_file *m, void *v)  { -	struct afs_server *server; +	struct afs_endpoint_state *estate;  	struct afs_addr_list *alist; +	struct afs_server *server; +	unsigned long failed;  	int i;  	if (v == SEQ_START_TOKEN) { -		seq_puts(m, "UUID                                 REF ACT\n"); +		seq_puts(m, "UUID                                 REF ACT CELL\n");  		return 0;  	}  	server = list_entry(v, struct afs_server, proc_link); -	alist = rcu_dereference(server->addresses); -	seq_printf(m, "%pU %3d %3d\n", +	estate = rcu_dereference(server->endpoint_state); +	alist = estate->addresses; +	seq_printf(m, "%pU %3d %3d %s\n",  		   &server->uuid,  		   refcount_read(&server->ref), -		   atomic_read(&server->active)); -	seq_printf(m, "  - info: fl=%lx rtt=%u brk=%x\n", -		   server->flags, server->rtt, server->cb_s_break); -	seq_printf(m, "  - probe: last=%d out=%d\n", -		   (int)(jiffies - server->probed_at) / HZ, -		   atomic_read(&server->probe_outstanding)); -	seq_printf(m, "  - ALIST v=%u rsp=%lx f=%lx\n", -		   alist->version, alist->responded, alist->failed); -	for (i = 0; i < alist->nr_addrs; i++) -		seq_printf(m, "    [%x] %pISpc%s\n", -			   i, &alist->addrs[i].transport, -			   alist->preferred == i ? "*" : ""); +		   atomic_read(&server->active), +		   server->cell->name); +	seq_printf(m, "  - info: fl=%lx rtt=%u\n", +		   server->flags, server->rtt); +	seq_printf(m, "  - probe: last=%d\n", +		   (int)(jiffies - server->probed_at) / HZ); +	failed = estate->failed_set; +	seq_printf(m, "  - ESTATE pq=%x np=%u rsp=%lx f=%lx\n", +		   estate->probe_seq, atomic_read(&estate->nr_probing), +		   estate->responsive_set, estate->failed_set); +	seq_printf(m, "  - ALIST v=%u ap=%u\n", +		   alist->version, alist->addr_pref_version); +	for (i = 0; i < alist->nr_addrs; i++) { +		const struct afs_address *addr = &alist->addrs[i]; + +		seq_printf(m, "    [%x] %pISpc%s rtt=%d err=%d p=%u\n", +			   i, rxrpc_kernel_remote_addr(addr->peer), +			   alist->preferred == i ? "*" : +			   test_bit(i, &failed) ? "!" : "", +			   rxrpc_kernel_get_srtt(addr->peer), +			   addr->last_error, addr->prio); +	}  	return 0;  } @@ -681,7 +743,11 @@ int afs_proc_init(struct afs_net *net)  					&afs_proc_sysname_ops,  					afs_proc_sysname_write,  					sizeof(struct seq_net_private), -					NULL)) +					NULL) || +	    !proc_create_net_single_write("addr_prefs", 0644, p, +					  afs_proc_addr_prefs_show, +					  afs_proc_addr_prefs_write, +					  NULL))  		goto error_tree;  	net->proc_afs = p;  |