diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-08-12 16:35:20 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-08-22 08:58:22 -0400 |
commit | d1b748a5e71106481015e36ce327747b075bcbdc (patch) | |
tree | a2f27548947f369ebd60afcb0a57b52bae1863d0 /fs | |
parent | 42113a75399353d87baf63956ab8f450958f1c8f (diff) |
NFSv4: Add tracepoints for debugging file locking
Set up basic tracepoints for debugging NFSv4 file lock/unlock
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 9 | ||||
-rw-r--r-- | fs/nfs/nfs4trace.h | 75 |
2 files changed, 82 insertions, 2 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index d609198724ed..6d12c3eda17a 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -4964,8 +4964,9 @@ static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock * | |||
4964 | int err; | 4964 | int err; |
4965 | 4965 | ||
4966 | do { | 4966 | do { |
4967 | err = nfs4_handle_exception(NFS_SERVER(state->inode), | 4967 | err = _nfs4_proc_getlk(state, cmd, request); |
4968 | _nfs4_proc_getlk(state, cmd, request), | 4968 | trace_nfs4_get_lock(request, state, cmd, err); |
4969 | err = nfs4_handle_exception(NFS_SERVER(state->inode), err, | ||
4969 | &exception); | 4970 | &exception); |
4970 | } while (exception.retry); | 4971 | } while (exception.retry); |
4971 | return err; | 4972 | return err; |
@@ -5163,6 +5164,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * | |||
5163 | rpc_put_task(task); | 5164 | rpc_put_task(task); |
5164 | out: | 5165 | out: |
5165 | request->fl_flags = fl_flags; | 5166 | request->fl_flags = fl_flags; |
5167 | trace_nfs4_unlock(request, state, F_SETLK, status); | ||
5166 | return status; | 5168 | return status; |
5167 | } | 5169 | } |
5168 | 5170 | ||
@@ -5386,6 +5388,7 @@ static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request | |||
5386 | if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) | 5388 | if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) |
5387 | return 0; | 5389 | return 0; |
5388 | err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM); | 5390 | err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM); |
5391 | trace_nfs4_lock_reclaim(request, state, F_SETLK, err); | ||
5389 | if (err != -NFS4ERR_DELAY) | 5392 | if (err != -NFS4ERR_DELAY) |
5390 | break; | 5393 | break; |
5391 | nfs4_handle_exception(server, err, &exception); | 5394 | nfs4_handle_exception(server, err, &exception); |
@@ -5408,6 +5411,7 @@ static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request | |||
5408 | if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) | 5411 | if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) |
5409 | return 0; | 5412 | return 0; |
5410 | err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED); | 5413 | err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED); |
5414 | trace_nfs4_lock_expired(request, state, F_SETLK, err); | ||
5411 | switch (err) { | 5415 | switch (err) { |
5412 | default: | 5416 | default: |
5413 | goto out; | 5417 | goto out; |
@@ -5530,6 +5534,7 @@ static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock * | |||
5530 | 5534 | ||
5531 | do { | 5535 | do { |
5532 | err = _nfs4_proc_setlk(state, cmd, request); | 5536 | err = _nfs4_proc_setlk(state, cmd, request); |
5537 | trace_nfs4_set_lock(request, state, cmd, err); | ||
5533 | if (err == -NFS4ERR_DENIED) | 5538 | if (err == -NFS4ERR_DENIED) |
5534 | err = -EAGAIN; | 5539 | err = -EAGAIN; |
5535 | err = nfs4_handle_exception(NFS_SERVER(state->inode), | 5540 | err = nfs4_handle_exception(NFS_SERVER(state->inode), |
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index a558dc9c7c52..3f124dbcd60a 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h | |||
@@ -336,6 +336,81 @@ TRACE_EVENT(nfs4_close, | |||
336 | ) | 336 | ) |
337 | ); | 337 | ); |
338 | 338 | ||
339 | #define show_lock_cmd(type) \ | ||
340 | __print_symbolic((int)type, \ | ||
341 | { F_GETLK, "GETLK" }, \ | ||
342 | { F_SETLK, "SETLK" }, \ | ||
343 | { F_SETLKW, "SETLKW" }) | ||
344 | #define show_lock_type(type) \ | ||
345 | __print_symbolic((int)type, \ | ||
346 | { F_RDLCK, "RDLCK" }, \ | ||
347 | { F_WRLCK, "WRLCK" }, \ | ||
348 | { F_UNLCK, "UNLCK" }) | ||
349 | |||
350 | DECLARE_EVENT_CLASS(nfs4_lock_event, | ||
351 | TP_PROTO( | ||
352 | const struct file_lock *request, | ||
353 | const struct nfs4_state *state, | ||
354 | int cmd, | ||
355 | int error | ||
356 | ), | ||
357 | |||
358 | TP_ARGS(request, state, cmd, error), | ||
359 | |||
360 | TP_STRUCT__entry( | ||
361 | __field(int, error) | ||
362 | __field(int, cmd) | ||
363 | __field(char, type) | ||
364 | __field(loff_t, start) | ||
365 | __field(loff_t, end) | ||
366 | __field(dev_t, dev) | ||
367 | __field(u32, fhandle) | ||
368 | __field(u64, fileid) | ||
369 | ), | ||
370 | |||
371 | TP_fast_assign( | ||
372 | const struct inode *inode = state->inode; | ||
373 | |||
374 | __entry->error = error; | ||
375 | __entry->cmd = cmd; | ||
376 | __entry->type = request->fl_type; | ||
377 | __entry->start = request->fl_start; | ||
378 | __entry->end = request->fl_end; | ||
379 | __entry->dev = inode->i_sb->s_dev; | ||
380 | __entry->fileid = NFS_FILEID(inode); | ||
381 | __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); | ||
382 | ), | ||
383 | |||
384 | TP_printk( | ||
385 | "error=%d (%s) cmd=%s:%s range=%lld:%lld " | ||
386 | "fileid=%02x:%02x:%llu fhandle=0x%08x", | ||
387 | __entry->error, | ||
388 | show_nfsv4_errors(__entry->error), | ||
389 | show_lock_cmd(__entry->cmd), | ||
390 | show_lock_type(__entry->type), | ||
391 | (long long)__entry->start, | ||
392 | (long long)__entry->end, | ||
393 | MAJOR(__entry->dev), MINOR(__entry->dev), | ||
394 | (unsigned long long)__entry->fileid, | ||
395 | __entry->fhandle | ||
396 | ) | ||
397 | ); | ||
398 | |||
399 | #define DEFINE_NFS4_LOCK_EVENT(name) \ | ||
400 | DEFINE_EVENT(nfs4_lock_event, name, \ | ||
401 | TP_PROTO( \ | ||
402 | const struct file_lock *request, \ | ||
403 | const struct nfs4_state *state, \ | ||
404 | int cmd, \ | ||
405 | int error \ | ||
406 | ), \ | ||
407 | TP_ARGS(request, state, cmd, error)) | ||
408 | DEFINE_NFS4_LOCK_EVENT(nfs4_get_lock); | ||
409 | DEFINE_NFS4_LOCK_EVENT(nfs4_set_lock); | ||
410 | DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim); | ||
411 | DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired); | ||
412 | DEFINE_NFS4_LOCK_EVENT(nfs4_unlock); | ||
413 | |||
339 | #endif /* _TRACE_NFS4_H */ | 414 | #endif /* _TRACE_NFS4_H */ |
340 | 415 | ||
341 | #undef TRACE_INCLUDE_PATH | 416 | #undef TRACE_INCLUDE_PATH |