diff options
author | David Howells <dhowells@redhat.com> | 2019-06-20 13:12:16 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2019-06-20 13:12:16 -0400 |
commit | 051d25250b55c215a2254a0130d46fbd38bcbcc0 (patch) | |
tree | 0e53a2801fb6f964d85e663435041c01943cb878 /fs/afs/callback.c | |
parent | fa59f52f5b1412c373813e24e7cbe5ab44518ed8 (diff) |
afs: Add some callback management tracepoints
Add a couple of tracepoints to track callback management:
(1) afs_cb_miss - Logs when we were unable to apply a callback, either due
to the inode being discarded or due to a competing thread applying a
callback first.
(2) afs_cb_break - Logs when we attempted to clear the noted callback
promise, either due to the server explicitly breaking the callback,
the callback promise lapsing or a local event obsoleting it.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/callback.c')
-rw-r--r-- | fs/afs/callback.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/afs/callback.c b/fs/afs/callback.c index 915010464572..d66cd0364243 100644 --- a/fs/afs/callback.c +++ b/fs/afs/callback.c | |||
@@ -212,7 +212,7 @@ void afs_init_callback_state(struct afs_server *server) | |||
212 | /* | 212 | /* |
213 | * actually break a callback | 213 | * actually break a callback |
214 | */ | 214 | */ |
215 | void __afs_break_callback(struct afs_vnode *vnode) | 215 | void __afs_break_callback(struct afs_vnode *vnode, enum afs_cb_break_reason reason) |
216 | { | 216 | { |
217 | _enter(""); | 217 | _enter(""); |
218 | 218 | ||
@@ -223,13 +223,17 @@ void __afs_break_callback(struct afs_vnode *vnode) | |||
223 | 223 | ||
224 | if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB) | 224 | if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB) |
225 | afs_lock_may_be_available(vnode); | 225 | afs_lock_may_be_available(vnode); |
226 | |||
227 | trace_afs_cb_break(&vnode->fid, vnode->cb_break, reason, true); | ||
228 | } else { | ||
229 | trace_afs_cb_break(&vnode->fid, vnode->cb_break, reason, false); | ||
226 | } | 230 | } |
227 | } | 231 | } |
228 | 232 | ||
229 | void afs_break_callback(struct afs_vnode *vnode) | 233 | void afs_break_callback(struct afs_vnode *vnode, enum afs_cb_break_reason reason) |
230 | { | 234 | { |
231 | write_seqlock(&vnode->cb_lock); | 235 | write_seqlock(&vnode->cb_lock); |
232 | __afs_break_callback(vnode); | 236 | __afs_break_callback(vnode, reason); |
233 | write_sequnlock(&vnode->cb_lock); | 237 | write_sequnlock(&vnode->cb_lock); |
234 | } | 238 | } |
235 | 239 | ||
@@ -277,6 +281,8 @@ static void afs_break_one_callback(struct afs_server *server, | |||
277 | 281 | ||
278 | write_lock(&volume->cb_v_break_lock); | 282 | write_lock(&volume->cb_v_break_lock); |
279 | volume->cb_v_break++; | 283 | volume->cb_v_break++; |
284 | trace_afs_cb_break(fid, volume->cb_v_break, | ||
285 | afs_cb_break_for_volume_callback, false); | ||
280 | write_unlock(&volume->cb_v_break_lock); | 286 | write_unlock(&volume->cb_v_break_lock); |
281 | } else { | 287 | } else { |
282 | data.volume = NULL; | 288 | data.volume = NULL; |
@@ -285,8 +291,10 @@ static void afs_break_one_callback(struct afs_server *server, | |||
285 | afs_iget5_test, &data); | 291 | afs_iget5_test, &data); |
286 | if (inode) { | 292 | if (inode) { |
287 | vnode = AFS_FS_I(inode); | 293 | vnode = AFS_FS_I(inode); |
288 | afs_break_callback(vnode); | 294 | afs_break_callback(vnode, afs_cb_break_for_callback); |
289 | iput(inode); | 295 | iput(inode); |
296 | } else { | ||
297 | trace_afs_cb_miss(fid, afs_cb_break_for_callback); | ||
290 | } | 298 | } |
291 | } | 299 | } |
292 | } | 300 | } |