Commit f6cbb368 authored by David Howells's avatar David Howells

afs: Actively poll fileservers to maintain NAT or firewall openings

When an AFS client accesses a file, it receives a limited-duration callback
promise that the server will notify it if another client changes a file.
This callback duration can be a few hours in length.

If a client mounts a volume and then an application prevents it from being
unmounted, say by chdir'ing into it, but then does nothing for some time,
the rxrpc_peer record will expire and rxrpc-level keepalive will cease.

If there is NAT or a firewall between the client and the server, the route
back for the server may close after a comparatively short duration, meaning
that attempts by the server to notify the client may then bounce.

The client, however, may (so far as it knows) still have a valid unexpired
promise and will then rely on its cached data and will not see changes made
on the server by a third party until it incidentally rechecks the status or
the promise needs renewal.

To deal with this, the client needs to regularly probe the server.  This
has two effects: firstly, it keeps a route open back for the server, and
secondly, it causes the server to disgorge any notifications that got
queued up because they couldn't be sent.

Fix this by adding a mechanism to emit regular probes.

Two levels of probing are made available: Under normal circumstances the
'slow' queue will be used for a fileserver - this just probes the preferred
address once every 5 mins or so; however, if server fails to respond to any
probes, the server will shift to the 'fast' queue from which all its
interfaces will be probed every 30s.  When it finally responds, the record
will switch back to the slow queue.

Further notes:

 (1) Probing is now no longer driven from the fileserver rotation
     algorithm.

 (2) Probes are dispatched to all interfaces on a fileserver when that an
     afs_server object is set up to record it.

 (3) The afs_server object is removed from the probe queues when we start
     to probe it.  afs_is_probing_server() returns true if it's not listed
     - ie. it's undergoing probing.

 (4) The afs_server object is added back on to the probe queue when the
     final outstanding probe completes, but the probed_at time is set when
     we're about to launch a probe so that it's not dependent on the probe
     duration.

 (5) The timer and the work item added for this must be handed a count on
     net->servers_outstanding, which they hand on or release.  This makes
     sure that network namespace cleanup waits for them.

Fixes: d2ddc776 ("afs: Overhaul volume and server record caching and fileserver rotation")
Reported-by: default avatarDave Botsch <botsch@cnf.cornell.edu>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 977e5f8e
...@@ -157,7 +157,7 @@ static int afs_record_cm_probe(struct afs_call *call, struct afs_server *server) ...@@ -157,7 +157,7 @@ static int afs_record_cm_probe(struct afs_call *call, struct afs_server *server)
_enter(""); _enter("");
if (test_bit(AFS_SERVER_FL_HAVE_EPOCH, &server->flags) && if (test_bit(AFS_SERVER_FL_HAVE_EPOCH, &server->flags) &&
!test_bit(AFS_SERVER_FL_PROBING, &server->flags)) { !afs_is_probing_server(server)) {
if (server->cm_epoch == call->epoch) if (server->cm_epoch == call->epoch)
return 0; return 0;
......
This diff is collapsed.
...@@ -1905,14 +1905,13 @@ static const struct afs_call_type afs_RXFSGetCapabilities = { ...@@ -1905,14 +1905,13 @@ static const struct afs_call_type afs_RXFSGetCapabilities = {
}; };
/* /*
* Probe a fileserver for the capabilities that it supports. This can * Probe a fileserver for the capabilities that it supports. This RPC can
* return up to 196 words. * reply with up to 196 words. The operation is asynchronous and if we managed
*/ * to allocate a call, true is returned the result is delivered through the
struct afs_call *afs_fs_get_capabilities(struct afs_net *net, * ->done() - otherwise we return false to indicate we didn't even try.
struct afs_server *server, */
struct afs_addr_cursor *ac, bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
struct key *key, struct afs_addr_cursor *ac, struct key *key)
unsigned int server_index)
{ {
struct afs_call *call; struct afs_call *call;
__be32 *bp; __be32 *bp;
...@@ -1921,11 +1920,10 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net, ...@@ -1921,11 +1920,10 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net,
call = afs_alloc_flat_call(net, &afs_RXFSGetCapabilities, 1 * 4, 16 * 4); call = afs_alloc_flat_call(net, &afs_RXFSGetCapabilities, 1 * 4, 16 * 4);
if (!call) if (!call)
return ERR_PTR(-ENOMEM); return false;
call->key = key; call->key = key;
call->server = afs_use_server(server, afs_server_trace_get_caps); call->server = afs_use_server(server, afs_server_trace_get_caps);
call->server_index = server_index;
call->upgrade = true; call->upgrade = true;
call->async = true; call->async = true;
call->max_lifespan = AFS_PROBE_MAX_LIFESPAN; call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
...@@ -1936,7 +1934,8 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net, ...@@ -1936,7 +1934,8 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net,
trace_afs_make_fs_call(call, NULL); trace_afs_make_fs_call(call, NULL);
afs_make_call(ac, call, GFP_NOFS); afs_make_call(ac, call, GFP_NOFS);
return call; afs_put_call(call);
return true;
} }
/* /*
......
...@@ -90,7 +90,6 @@ struct afs_addr_list { ...@@ -90,7 +90,6 @@ struct afs_addr_list {
unsigned char nr_ipv4; /* Number of IPv4 addresses */ unsigned char nr_ipv4; /* Number of IPv4 addresses */
enum dns_record_source source:8; enum dns_record_source source:8;
enum dns_lookup_status status:8; enum dns_lookup_status status:8;
unsigned long probed; /* Mask of servers that have been probed */
unsigned long failed; /* Mask of addrs that failed locally/ICMP */ unsigned long failed; /* Mask of addrs that failed locally/ICMP */
unsigned long responded; /* Mask of addrs that responded */ unsigned long responded; /* Mask of addrs that responded */
struct sockaddr_rxrpc addrs[]; struct sockaddr_rxrpc addrs[];
...@@ -299,9 +298,10 @@ struct afs_net { ...@@ -299,9 +298,10 @@ struct afs_net {
* cell, but in practice, people create aliases and subsets and there's * cell, but in practice, people create aliases and subsets and there's
* no easy way to distinguish them. * no easy way to distinguish them.
*/ */
seqlock_t fs_lock; /* For fs_servers */ seqlock_t fs_lock; /* For fs_servers, fs_probe_*, fs_proc */
struct rb_root fs_servers; /* afs_server (by server UUID or address) */ struct rb_root fs_servers; /* afs_server (by server UUID or address) */
struct list_head fs_updates; /* afs_server (by update_at) */ struct list_head fs_probe_fast; /* List of afs_server to probe at 30s intervals */
struct list_head fs_probe_slow; /* List of afs_server to probe at 5m intervals */
struct hlist_head fs_proc; /* procfs servers list */ struct hlist_head fs_proc; /* procfs servers list */
struct hlist_head fs_addresses4; /* afs_server (by lowest IPv4 addr) */ struct hlist_head fs_addresses4; /* afs_server (by lowest IPv4 addr) */
...@@ -310,6 +310,9 @@ struct afs_net { ...@@ -310,6 +310,9 @@ struct afs_net {
struct work_struct fs_manager; struct work_struct fs_manager;
struct timer_list fs_timer; struct timer_list fs_timer;
struct work_struct fs_prober;
struct timer_list fs_probe_timer;
atomic_t servers_outstanding; atomic_t servers_outstanding;
/* File locking renewal management */ /* File locking renewal management */
...@@ -493,7 +496,8 @@ struct afs_server { ...@@ -493,7 +496,8 @@ struct afs_server {
}; };
struct afs_addr_list __rcu *addresses; struct afs_addr_list __rcu *addresses;
struct rb_node uuid_rb; /* Link in net->servers */ struct rb_node uuid_rb; /* Link in net->fs_servers */
struct list_head probe_link; /* Link in net->fs_probe_list */
struct hlist_node addr4_link; /* Link in net->fs_addresses4 */ struct hlist_node addr4_link; /* Link in net->fs_addresses4 */
struct hlist_node addr6_link; /* Link in net->fs_addresses6 */ struct hlist_node addr6_link; /* Link in net->fs_addresses6 */
struct hlist_node proc_link; /* Link in net->fs_proc */ struct hlist_node proc_link; /* Link in net->fs_proc */
...@@ -504,8 +508,6 @@ struct afs_server { ...@@ -504,8 +508,6 @@ struct afs_server {
#define AFS_SERVER_FL_NOT_FOUND 2 /* VL server says no such server */ #define AFS_SERVER_FL_NOT_FOUND 2 /* VL server says no such server */
#define AFS_SERVER_FL_VL_FAIL 3 /* Failed to access VL server */ #define AFS_SERVER_FL_VL_FAIL 3 /* Failed to access VL server */
#define AFS_SERVER_FL_UPDATING 4 #define AFS_SERVER_FL_UPDATING 4
#define AFS_SERVER_FL_PROBED 5 /* The fileserver has been probed */
#define AFS_SERVER_FL_PROBING 6 /* Fileserver is being probed */
#define AFS_SERVER_FL_NO_IBULK 7 /* Fileserver doesn't support FS.InlineBulkStatus */ #define AFS_SERVER_FL_NO_IBULK 7 /* Fileserver doesn't support FS.InlineBulkStatus */
#define AFS_SERVER_FL_MAY_HAVE_CB 8 /* May have callbacks on this fileserver */ #define AFS_SERVER_FL_MAY_HAVE_CB 8 /* May have callbacks on this fileserver */
#define AFS_SERVER_FL_IS_YFS 9 /* Server is YFS not AFS */ #define AFS_SERVER_FL_IS_YFS 9 /* Server is YFS not AFS */
...@@ -527,6 +529,7 @@ struct afs_server { ...@@ -527,6 +529,7 @@ struct afs_server {
rwlock_t cb_break_lock; /* Volume finding lock */ rwlock_t cb_break_lock; /* Volume finding lock */
/* Probe state */ /* Probe state */
unsigned long probed_at; /* Time last probe was dispatched (jiffies) */
wait_queue_head_t probe_wq; wait_queue_head_t probe_wq;
atomic_t probe_outstanding; atomic_t probe_outstanding;
spinlock_t probe_lock; spinlock_t probe_lock;
...@@ -956,7 +959,6 @@ extern int afs_flock(struct file *, int, struct file_lock *); ...@@ -956,7 +959,6 @@ extern int afs_flock(struct file *, int, struct file_lock *);
*/ */
extern int afs_fs_fetch_file_status(struct afs_fs_cursor *, struct afs_status_cb *, extern int afs_fs_fetch_file_status(struct afs_fs_cursor *, struct afs_status_cb *,
struct afs_volsync *); struct afs_volsync *);
extern int afs_fs_give_up_callbacks(struct afs_net *, struct afs_server *);
extern int afs_fs_fetch_data(struct afs_fs_cursor *, struct afs_status_cb *, struct afs_read *); extern int afs_fs_fetch_data(struct afs_fs_cursor *, struct afs_status_cb *, struct afs_read *);
extern int afs_fs_create(struct afs_fs_cursor *, const char *, umode_t, extern int afs_fs_create(struct afs_fs_cursor *, const char *, umode_t,
struct afs_status_cb *, struct afs_fid *, struct afs_status_cb *); struct afs_status_cb *, struct afs_fid *, struct afs_status_cb *);
...@@ -978,9 +980,8 @@ extern int afs_fs_extend_lock(struct afs_fs_cursor *, struct afs_status_cb *); ...@@ -978,9 +980,8 @@ extern int afs_fs_extend_lock(struct afs_fs_cursor *, struct afs_status_cb *);
extern int afs_fs_release_lock(struct afs_fs_cursor *, struct afs_status_cb *); extern int afs_fs_release_lock(struct afs_fs_cursor *, struct afs_status_cb *);
extern int afs_fs_give_up_all_callbacks(struct afs_net *, struct afs_server *, extern int afs_fs_give_up_all_callbacks(struct afs_net *, struct afs_server *,
struct afs_addr_cursor *, struct key *); struct afs_addr_cursor *, struct key *);
extern struct afs_call *afs_fs_get_capabilities(struct afs_net *, struct afs_server *, extern bool afs_fs_get_capabilities(struct afs_net *, struct afs_server *,
struct afs_addr_cursor *, struct key *, struct afs_addr_cursor *, struct key *);
unsigned int);
extern int afs_fs_inline_bulk_status(struct afs_fs_cursor *, struct afs_net *, extern int afs_fs_inline_bulk_status(struct afs_fs_cursor *, struct afs_net *,
struct afs_fid *, struct afs_status_cb *, struct afs_fid *, struct afs_status_cb *,
unsigned int, struct afs_volsync *); unsigned int, struct afs_volsync *);
...@@ -1001,8 +1002,9 @@ extern int afs_fs_store_acl(struct afs_fs_cursor *, const struct afs_acl *, ...@@ -1001,8 +1002,9 @@ extern int afs_fs_store_acl(struct afs_fs_cursor *, const struct afs_acl *,
* fs_probe.c * fs_probe.c
*/ */
extern void afs_fileserver_probe_result(struct afs_call *); extern void afs_fileserver_probe_result(struct afs_call *);
extern int afs_probe_fileservers(struct afs_net *, struct key *, struct afs_server_list *); extern void afs_fs_probe_fileserver(struct afs_net *, struct afs_server *, struct key *, bool);
extern int afs_wait_for_fs_probes(struct afs_server_list *, unsigned long); extern int afs_wait_for_fs_probes(struct afs_server_list *, unsigned long);
extern void afs_fs_probe_dispatcher(struct work_struct *);
/* /*
* inode.c * inode.c
...@@ -1251,9 +1253,26 @@ extern void afs_unuse_server_notime(struct afs_net *, struct afs_server *, enum ...@@ -1251,9 +1253,26 @@ extern void afs_unuse_server_notime(struct afs_net *, struct afs_server *, enum
extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace); extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
extern void afs_manage_servers(struct work_struct *); extern void afs_manage_servers(struct work_struct *);
extern void afs_servers_timer(struct timer_list *); extern void afs_servers_timer(struct timer_list *);
extern void afs_fs_probe_timer(struct timer_list *);
extern void __net_exit afs_purge_servers(struct afs_net *); extern void __net_exit afs_purge_servers(struct afs_net *);
extern bool afs_check_server_record(struct afs_fs_cursor *, struct afs_server *); extern bool afs_check_server_record(struct afs_fs_cursor *, struct afs_server *);
static inline void afs_inc_servers_outstanding(struct afs_net *net)
{
atomic_inc(&net->servers_outstanding);
}
static inline void afs_dec_servers_outstanding(struct afs_net *net)
{
if (atomic_dec_and_test(&net->servers_outstanding))
wake_up_var(&net->servers_outstanding);
}
static inline bool afs_is_probing_server(struct afs_server *server)
{
return list_empty(&server->probe_link);
}
/* /*
* server_list.c * server_list.c
*/ */
......
...@@ -87,7 +87,8 @@ static int __net_init afs_net_init(struct net *net_ns) ...@@ -87,7 +87,8 @@ static int __net_init afs_net_init(struct net *net_ns)
seqlock_init(&net->fs_lock); seqlock_init(&net->fs_lock);
net->fs_servers = RB_ROOT; net->fs_servers = RB_ROOT;
INIT_LIST_HEAD(&net->fs_updates); INIT_LIST_HEAD(&net->fs_probe_fast);
INIT_LIST_HEAD(&net->fs_probe_slow);
INIT_HLIST_HEAD(&net->fs_proc); INIT_HLIST_HEAD(&net->fs_proc);
INIT_HLIST_HEAD(&net->fs_addresses4); INIT_HLIST_HEAD(&net->fs_addresses4);
...@@ -96,6 +97,8 @@ static int __net_init afs_net_init(struct net *net_ns) ...@@ -96,6 +97,8 @@ static int __net_init afs_net_init(struct net *net_ns)
INIT_WORK(&net->fs_manager, afs_manage_servers); INIT_WORK(&net->fs_manager, afs_manage_servers);
timer_setup(&net->fs_timer, afs_servers_timer, 0); timer_setup(&net->fs_timer, afs_servers_timer, 0);
INIT_WORK(&net->fs_prober, afs_fs_probe_dispatcher);
timer_setup(&net->fs_probe_timer, afs_fs_probe_timer, 0);
ret = -ENOMEM; ret = -ENOMEM;
sysnames = kzalloc(sizeof(*sysnames), GFP_KERNEL); sysnames = kzalloc(sizeof(*sysnames), GFP_KERNEL);
......
...@@ -349,9 +349,6 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc) ...@@ -349,9 +349,6 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
goto failed; goto failed;
_debug("__ VOL %llx __", vnode->volume->vid); _debug("__ VOL %llx __", vnode->volume->vid);
error = afs_probe_fileservers(afs_v2net(vnode), fc->key, fc->server_list);
if (error < 0)
goto failed_set_error;
pick_server: pick_server:
_debug("pick [%lx]", fc->untried); _debug("pick [%lx]", fc->untried);
...@@ -596,8 +593,8 @@ static void afs_dump_edestaddrreq(const struct afs_fs_cursor *fc) ...@@ -596,8 +593,8 @@ static void afs_dump_edestaddrreq(const struct afs_fs_cursor *fc)
a->version, a->version,
a->nr_ipv4, a->nr_addrs, a->max_addrs, a->nr_ipv4, a->nr_addrs, a->max_addrs,
a->preferred); a->preferred);
pr_notice("FC: - pr=%lx R=%lx F=%lx\n", pr_notice("FC: - R=%lx F=%lx\n",
a->probed, a->responded, a->failed); a->responded, a->failed);
if (a == fc->ac.alist) if (a == fc->ac.alist)
pr_notice("FC: - current\n"); pr_notice("FC: - current\n");
} }
......
...@@ -14,17 +14,6 @@ ...@@ -14,17 +14,6 @@
static unsigned afs_server_gc_delay = 10; /* Server record timeout in seconds */ static unsigned afs_server_gc_delay = 10; /* Server record timeout in seconds */
static atomic_t afs_server_debug_id; static atomic_t afs_server_debug_id;
static void afs_inc_servers_outstanding(struct afs_net *net)
{
atomic_inc(&net->servers_outstanding);
}
static void afs_dec_servers_outstanding(struct afs_net *net)
{
if (atomic_dec_and_test(&net->servers_outstanding))
wake_up_var(&net->servers_outstanding);
}
static struct afs_server *afs_maybe_use_server(struct afs_server *, static struct afs_server *afs_maybe_use_server(struct afs_server *,
enum afs_server_trace); enum afs_server_trace);
static void __afs_put_server(struct afs_net *, struct afs_server *); static void __afs_put_server(struct afs_net *, struct afs_server *);
...@@ -226,6 +215,7 @@ static struct afs_server *afs_alloc_server(struct afs_net *net, ...@@ -226,6 +215,7 @@ static struct afs_server *afs_alloc_server(struct afs_net *net,
INIT_HLIST_HEAD(&server->cb_volumes); INIT_HLIST_HEAD(&server->cb_volumes);
rwlock_init(&server->cb_break_lock); rwlock_init(&server->cb_break_lock);
init_waitqueue_head(&server->probe_wq); init_waitqueue_head(&server->probe_wq);
INIT_LIST_HEAD(&server->probe_link);
spin_lock_init(&server->probe_lock); spin_lock_init(&server->probe_lock);
afs_inc_servers_outstanding(net); afs_inc_servers_outstanding(net);
...@@ -295,6 +285,12 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell, struct key *key, ...@@ -295,6 +285,12 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell, struct key *key,
if (server != candidate) { if (server != candidate) {
afs_put_addrlist(alist); afs_put_addrlist(alist);
kfree(candidate); kfree(candidate);
} else {
/* Immediately dispatch an asynchronous probe to each interface
* on the fileserver. This will make sure the repeat-probing
* service is started.
*/
afs_fs_probe_fileserver(cell->net, server, key, true);
} }
return server; return server;
...@@ -464,6 +460,7 @@ static void afs_gc_servers(struct afs_net *net, struct afs_server *gc_list) ...@@ -464,6 +460,7 @@ static void afs_gc_servers(struct afs_net *net, struct afs_server *gc_list)
trace_afs_server(server, atomic_read(&server->ref), trace_afs_server(server, atomic_read(&server->ref),
active, afs_server_trace_gc); active, afs_server_trace_gc);
rb_erase(&server->uuid_rb, &net->fs_servers); rb_erase(&server->uuid_rb, &net->fs_servers);
list_del(&server->probe_link);
hlist_del_rcu(&server->proc_link); hlist_del_rcu(&server->proc_link);
if (!hlist_unhashed(&server->addr4_link)) if (!hlist_unhashed(&server->addr4_link))
hlist_del_rcu(&server->addr4_link); hlist_del_rcu(&server->addr4_link);
......
...@@ -266,7 +266,6 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key) ...@@ -266,7 +266,6 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key)
} }
volume->update_at = ktime_get_real_seconds() + afs_volume_record_life; volume->update_at = ktime_get_real_seconds() + afs_volume_record_life;
clear_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags);
write_unlock(&volume->servers_lock); write_unlock(&volume->servers_lock);
ret = 0; ret = 0;
...@@ -283,23 +282,25 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key) ...@@ -283,23 +282,25 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key)
*/ */
int afs_check_volume_status(struct afs_volume *volume, struct afs_fs_cursor *fc) int afs_check_volume_status(struct afs_volume *volume, struct afs_fs_cursor *fc)
{ {
time64_t now = ktime_get_real_seconds();
int ret, retries = 0; int ret, retries = 0;
_enter(""); _enter("");
if (volume->update_at <= now)
set_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags);
retry: retry:
if (!test_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags) && if (test_bit(AFS_VOLUME_WAIT, &volume->flags))
!test_bit(AFS_VOLUME_WAIT, &volume->flags)) { goto wait;
_leave(" = 0"); if (volume->update_at <= ktime_get_real_seconds() ||
return 0; test_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags))
} goto update;
_leave(" = 0");
return 0;
update:
if (!test_and_set_bit_lock(AFS_VOLUME_UPDATING, &volume->flags)) { if (!test_and_set_bit_lock(AFS_VOLUME_UPDATING, &volume->flags)) {
clear_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags);
ret = afs_update_volume_status(volume, fc->key); ret = afs_update_volume_status(volume, fc->key);
if (ret < 0)
set_bit(AFS_VOLUME_NEEDS_UPDATE, &volume->flags);
clear_bit_unlock(AFS_VOLUME_WAIT, &volume->flags); clear_bit_unlock(AFS_VOLUME_WAIT, &volume->flags);
clear_bit_unlock(AFS_VOLUME_UPDATING, &volume->flags); clear_bit_unlock(AFS_VOLUME_UPDATING, &volume->flags);
wake_up_bit(&volume->flags, AFS_VOLUME_WAIT); wake_up_bit(&volume->flags, AFS_VOLUME_WAIT);
...@@ -307,6 +308,7 @@ int afs_check_volume_status(struct afs_volume *volume, struct afs_fs_cursor *fc) ...@@ -307,6 +308,7 @@ int afs_check_volume_status(struct afs_volume *volume, struct afs_fs_cursor *fc)
return ret; return ret;
} }
wait:
if (!test_bit(AFS_VOLUME_WAIT, &volume->flags)) { if (!test_bit(AFS_VOLUME_WAIT, &volume->flags)) {
_leave(" = 0 [no wait]"); _leave(" = 0 [no wait]");
return 0; return 0;
......
...@@ -38,10 +38,12 @@ enum afs_server_trace { ...@@ -38,10 +38,12 @@ enum afs_server_trace {
afs_server_trace_get_caps, afs_server_trace_get_caps,
afs_server_trace_get_install, afs_server_trace_get_install,
afs_server_trace_get_new_cbi, afs_server_trace_get_new_cbi,
afs_server_trace_get_probe,
afs_server_trace_give_up_cb, afs_server_trace_give_up_cb,
afs_server_trace_put_call, afs_server_trace_put_call,
afs_server_trace_put_cbi, afs_server_trace_put_cbi,
afs_server_trace_put_find_rsq, afs_server_trace_put_find_rsq,
afs_server_trace_put_probe,
afs_server_trace_put_slist, afs_server_trace_put_slist,
afs_server_trace_put_slist_isort, afs_server_trace_put_slist_isort,
afs_server_trace_put_uuid_rsq, afs_server_trace_put_uuid_rsq,
...@@ -247,10 +249,12 @@ enum afs_cb_break_reason { ...@@ -247,10 +249,12 @@ enum afs_cb_break_reason {
EM(afs_server_trace_get_caps, "GET caps ") \ EM(afs_server_trace_get_caps, "GET caps ") \
EM(afs_server_trace_get_install, "GET inst ") \ EM(afs_server_trace_get_install, "GET inst ") \
EM(afs_server_trace_get_new_cbi, "GET cbi ") \ EM(afs_server_trace_get_new_cbi, "GET cbi ") \
EM(afs_server_trace_get_probe, "GET probe") \
EM(afs_server_trace_give_up_cb, "giveup-cb") \ EM(afs_server_trace_give_up_cb, "giveup-cb") \
EM(afs_server_trace_put_call, "PUT call ") \ EM(afs_server_trace_put_call, "PUT call ") \
EM(afs_server_trace_put_cbi, "PUT cbi ") \ EM(afs_server_trace_put_cbi, "PUT cbi ") \
EM(afs_server_trace_put_find_rsq, "PUT f-rsq") \ EM(afs_server_trace_put_find_rsq, "PUT f-rsq") \
EM(afs_server_trace_put_probe, "PUT probe") \
EM(afs_server_trace_put_slist, "PUT slist") \ EM(afs_server_trace_put_slist, "PUT slist") \
EM(afs_server_trace_put_slist_isort, "PUT isort") \ EM(afs_server_trace_put_slist_isort, "PUT isort") \
EM(afs_server_trace_put_uuid_rsq, "PUT u-req") \ EM(afs_server_trace_put_uuid_rsq, "PUT u-req") \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment