Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1b748a5 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Add tracepoints for debugging file locking



Set up basic tracepoints for debugging NFSv4 file lock/unlock

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 42113a75
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -4964,8 +4964,9 @@ static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *
	int err;
	int err;


	do {
	do {
		err = nfs4_handle_exception(NFS_SERVER(state->inode),
		err = _nfs4_proc_getlk(state, cmd, request);
				_nfs4_proc_getlk(state, cmd, request),
		trace_nfs4_get_lock(request, state, cmd, err);
		err = nfs4_handle_exception(NFS_SERVER(state->inode), err,
				&exception);
				&exception);
	} while (exception.retry);
	} while (exception.retry);
	return err;
	return err;
@@ -5163,6 +5164,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *
	rpc_put_task(task);
	rpc_put_task(task);
out:
out:
	request->fl_flags = fl_flags;
	request->fl_flags = fl_flags;
	trace_nfs4_unlock(request, state, F_SETLK, status);
	return status;
	return status;
}
}


@@ -5386,6 +5388,7 @@ static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request
		if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
		if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
			return 0;
			return 0;
		err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
		err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
		trace_nfs4_lock_reclaim(request, state, F_SETLK, err);
		if (err != -NFS4ERR_DELAY)
		if (err != -NFS4ERR_DELAY)
			break;
			break;
		nfs4_handle_exception(server, err, &exception);
		nfs4_handle_exception(server, err, &exception);
@@ -5408,6 +5411,7 @@ static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request
		if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
		if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
			return 0;
			return 0;
		err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED);
		err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED);
		trace_nfs4_lock_expired(request, state, F_SETLK, err);
		switch (err) {
		switch (err) {
		default:
		default:
			goto out;
			goto out;
@@ -5530,6 +5534,7 @@ static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *


	do {
	do {
		err = _nfs4_proc_setlk(state, cmd, request);
		err = _nfs4_proc_setlk(state, cmd, request);
		trace_nfs4_set_lock(request, state, cmd, err);
		if (err == -NFS4ERR_DENIED)
		if (err == -NFS4ERR_DENIED)
			err = -EAGAIN;
			err = -EAGAIN;
		err = nfs4_handle_exception(NFS_SERVER(state->inode),
		err = nfs4_handle_exception(NFS_SERVER(state->inode),
+75 −0
Original line number Original line Diff line number Diff line
@@ -336,6 +336,81 @@ TRACE_EVENT(nfs4_close,
		)
		)
);
);


#define show_lock_cmd(type) \
	__print_symbolic((int)type, \
		{ F_GETLK, "GETLK" }, \
		{ F_SETLK, "SETLK" }, \
		{ F_SETLKW, "SETLKW" })
#define show_lock_type(type) \
	__print_symbolic((int)type, \
		{ F_RDLCK, "RDLCK" }, \
		{ F_WRLCK, "WRLCK" }, \
		{ F_UNLCK, "UNLCK" })

DECLARE_EVENT_CLASS(nfs4_lock_event,
		TP_PROTO(
			const struct file_lock *request,
			const struct nfs4_state *state,
			int cmd,
			int error
		),

		TP_ARGS(request, state, cmd, error),

		TP_STRUCT__entry(
			__field(int, error)
			__field(int, cmd)
			__field(char, type)
			__field(loff_t, start)
			__field(loff_t, end)
			__field(dev_t, dev)
			__field(u32, fhandle)
			__field(u64, fileid)
		),

		TP_fast_assign(
			const struct inode *inode = state->inode;

			__entry->error = error;
			__entry->cmd = cmd;
			__entry->type = request->fl_type;
			__entry->start = request->fl_start;
			__entry->end = request->fl_end;
			__entry->dev = inode->i_sb->s_dev;
			__entry->fileid = NFS_FILEID(inode);
			__entry->fhandle = nfs_fhandle_hash(NFS_FH(inode));
		),

		TP_printk(
			"error=%d (%s) cmd=%s:%s range=%lld:%lld "
			"fileid=%02x:%02x:%llu fhandle=0x%08x",
			__entry->error,
			show_nfsv4_errors(__entry->error),
			show_lock_cmd(__entry->cmd),
			show_lock_type(__entry->type),
			(long long)__entry->start,
			(long long)__entry->end,
			MAJOR(__entry->dev), MINOR(__entry->dev),
			(unsigned long long)__entry->fileid,
			__entry->fhandle
		)
);

#define DEFINE_NFS4_LOCK_EVENT(name) \
	DEFINE_EVENT(nfs4_lock_event, name, \
			TP_PROTO( \
				const struct file_lock *request, \
				const struct nfs4_state *state, \
				int cmd, \
				int error \
			), \
			TP_ARGS(request, state, cmd, error))
DEFINE_NFS4_LOCK_EVENT(nfs4_get_lock);
DEFINE_NFS4_LOCK_EVENT(nfs4_set_lock);
DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim);
DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired);
DEFINE_NFS4_LOCK_EVENT(nfs4_unlock);

#endif /* _TRACE_NFS4_H */
#endif /* _TRACE_NFS4_H */


#undef TRACE_INCLUDE_PATH
#undef TRACE_INCLUDE_PATH