summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2013-08-12 16:35:20 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-08-22 08:58:22 -0400
commitd1b748a5e71106481015e36ce327747b075bcbdc (patch)
treea2f27548947f369ebd60afcb0a57b52bae1863d0 /fs
parent42113a75399353d87baf63956ab8f450958f1c8f (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.c9
-rw-r--r--fs/nfs/nfs4trace.h75
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);
5164out: 5165out:
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
350DECLARE_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))
408DEFINE_NFS4_LOCK_EVENT(nfs4_get_lock);
409DEFINE_NFS4_LOCK_EVENT(nfs4_set_lock);
410DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim);
411DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired);
412DEFINE_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