Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

afs: Expose information from afs_vlserver through /proc for debugging

Convert various bitfields in afs_vlserver::probe to a mask and then expose
this and some other bits of information through /proc/net/afs/<cell>/vlservers
to make it easier to debug VL server communication issues.

Signed-off-by: David Howells <dhowells@redhat.com>

+22 -15
+5 -4
fs/afs/internal.h
··· 412 412 unsigned int rtt; /* RTT as ktime/64 */ 413 413 u32 abort_code; 414 414 short error; 415 - bool responded:1; 416 - bool is_yfs:1; 417 - bool not_yfs:1; 418 - bool local_failure:1; 415 + unsigned short flags; 416 + #define AFS_VLSERVER_PROBE_RESPONDED 0x01 /* At least once response (may be abort) */ 417 + #define AFS_VLSERVER_PROBE_IS_YFS 0x02 /* The peer appears to be YFS */ 418 + #define AFS_VLSERVER_PROBE_NOT_YFS 0x04 /* The peer appears not to be YFS */ 419 + #define AFS_VLSERVER_PROBE_LOCAL_FAILURE 0x08 /* A local failure prevented a probe */ 419 420 } probe; 420 421 421 422 u16 port;
+5
fs/afs/proc.c
··· 310 310 alist->preferred == i ? '>' : '-', 311 311 &alist->addrs[i].transport); 312 312 } 313 + seq_printf(m, " info: fl=%lx rtt=%d\n", vlserver->flags, vlserver->probe.rtt); 314 + seq_printf(m, " probe: fl=%x e=%d ac=%d out=%d\n", 315 + vlserver->probe.flags, vlserver->probe.error, 316 + vlserver->probe.abort_code, 317 + atomic_read(&vlserver->probe_outstanding)); 313 318 return 0; 314 319 } 315 320
+10 -10
fs/afs/vl_probe.c
··· 45 45 server->probe.error = 0; 46 46 goto responded; 47 47 case -ECONNABORTED: 48 - if (!server->probe.responded) { 48 + if (!(server->probe.flags & AFS_VLSERVER_PROBE_RESPONDED)) { 49 49 server->probe.abort_code = call->abort_code; 50 50 server->probe.error = ret; 51 51 } 52 52 goto responded; 53 53 case -ENOMEM: 54 54 case -ENONET: 55 - server->probe.local_failure = true; 55 + server->probe.flags |= AFS_VLSERVER_PROBE_LOCAL_FAILURE; 56 56 afs_io_error(call, afs_io_error_vl_probe_fail); 57 57 goto out; 58 58 case -ECONNRESET: /* Responded, but call expired. */ ··· 67 67 default: 68 68 clear_bit(index, &alist->responded); 69 69 set_bit(index, &alist->failed); 70 - if (!server->probe.responded && 70 + if (!(server->probe.flags & AFS_VLSERVER_PROBE_RESPONDED) && 71 71 (server->probe.error == 0 || 72 72 server->probe.error == -ETIMEDOUT || 73 73 server->probe.error == -ETIME)) ··· 81 81 clear_bit(index, &alist->failed); 82 82 83 83 if (call->service_id == YFS_VL_SERVICE) { 84 - server->probe.is_yfs = true; 84 + server->probe.flags |= AFS_VLSERVER_PROBE_IS_YFS; 85 85 set_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags); 86 86 alist->addrs[index].srx_service = call->service_id; 87 87 } else { 88 - server->probe.not_yfs = true; 89 - if (!server->probe.is_yfs) { 88 + server->probe.flags |= AFS_VLSERVER_PROBE_NOT_YFS; 89 + if (!(server->probe.flags & AFS_VLSERVER_PROBE_IS_YFS)) { 90 90 clear_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags); 91 91 alist->addrs[index].srx_service = call->service_id; 92 92 } ··· 100 100 } 101 101 102 102 smp_wmb(); /* Set rtt before responded. */ 103 - server->probe.responded = true; 103 + server->probe.flags |= AFS_VLSERVER_PROBE_RESPONDED; 104 104 set_bit(AFS_VLSERVER_FL_PROBED, &server->flags); 105 105 out: 106 106 spin_unlock(&server->probe_lock); ··· 202 202 server = vllist->servers[i].server; 203 203 if (!test_bit(AFS_VLSERVER_FL_PROBING, &server->flags)) 204 204 __clear_bit(i, &untried); 205 - if (server->probe.responded) 205 + if (server->probe.flags & AFS_VLSERVER_PROBE_RESPONDED) 206 206 have_responders = true; 207 207 } 208 208 } ··· 228 228 for (i = 0; i < vllist->nr_servers; i++) { 229 229 if (test_bit(i, &untried)) { 230 230 server = vllist->servers[i].server; 231 - if (server->probe.responded) 231 + if (server->probe.flags & AFS_VLSERVER_PROBE_RESPONDED) 232 232 goto stop; 233 233 if (test_bit(AFS_VLSERVER_FL_PROBING, &server->flags)) 234 234 still_probing = true; ··· 246 246 for (i = 0; i < vllist->nr_servers; i++) { 247 247 if (test_bit(i, &untried)) { 248 248 server = vllist->servers[i].server; 249 - if (server->probe.responded && 249 + if ((server->probe.flags & AFS_VLSERVER_PROBE_RESPONDED) && 250 250 server->probe.rtt < rtt) { 251 251 pref = i; 252 252 rtt = server->probe.rtt;
+2 -1
fs/afs/vl_rotate.c
··· 192 192 for (i = 0; i < vc->server_list->nr_servers; i++) { 193 193 struct afs_vlserver *s = vc->server_list->servers[i].server; 194 194 195 - if (!test_bit(i, &vc->untried) || !s->probe.responded) 195 + if (!test_bit(i, &vc->untried) || 196 + !(s->probe.flags & AFS_VLSERVER_PROBE_RESPONDED)) 196 197 continue; 197 198 if (s->probe.rtt < rtt) { 198 199 vc->index = i;