// nfsd errnos tapset
// Copyright (C) 2010 Red Hat Inc.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.

%{
#include <linux/nfs.h>
#include <linux/nfs4.h>

#define	nfs_ok			__constant_htonl(NFS_OK)
#define	nfserr_perm		__constant_htonl(NFSERR_PERM)
#define	nfserr_noent		__constant_htonl(NFSERR_NOENT)
#define	nfserr_io		__constant_htonl(NFSERR_IO)
#define	nfserr_nxio		__constant_htonl(NFSERR_NXIO)
#define	nfserr_eagain		__constant_htonl(NFSERR_EAGAIN)
#define	nfserr_acces		__constant_htonl(NFSERR_ACCES)
#define	nfserr_exist		__constant_htonl(NFSERR_EXIST)
#define	nfserr_xdev		__constant_htonl(NFSERR_XDEV)
#define	nfserr_nodev		__constant_htonl(NFSERR_NODEV)
#define	nfserr_notdir		__constant_htonl(NFSERR_NOTDIR)
#define	nfserr_isdir		__constant_htonl(NFSERR_ISDIR)
#define	nfserr_inval		__constant_htonl(NFSERR_INVAL)
#define	nfserr_fbig		__constant_htonl(NFSERR_FBIG)
#define	nfserr_nospc		__constant_htonl(NFSERR_NOSPC)
#define	nfserr_rofs		__constant_htonl(NFSERR_ROFS)
#define	nfserr_mlink		__constant_htonl(NFSERR_MLINK)
#define	nfserr_opnotsupp	__constant_htonl(NFSERR_OPNOTSUPP)
#define	nfserr_nametoolong	__constant_htonl(NFSERR_NAMETOOLONG)
#define	nfserr_notempty		__constant_htonl(NFSERR_NOTEMPTY)
#define	nfserr_dquot		__constant_htonl(NFSERR_DQUOT)
#define	nfserr_stale		__constant_htonl(NFSERR_STALE)
#define	nfserr_remote		__constant_htonl(NFSERR_REMOTE)
#define	nfserr_wflush		__constant_htonl(NFSERR_WFLUSH)
#define	nfserr_badhandle	__constant_htonl(NFSERR_BADHANDLE)
#define	nfserr_notsync		__constant_htonl(NFSERR_NOT_SYNC)
#define	nfserr_badcookie	__constant_htonl(NFSERR_BAD_COOKIE)
#define	nfserr_notsupp		__constant_htonl(NFSERR_NOTSUPP)
#define	nfserr_toosmall		__constant_htonl(NFSERR_TOOSMALL)
#define	nfserr_serverfault	__constant_htonl(NFSERR_SERVERFAULT)
#define	nfserr_badtype		__constant_htonl(NFSERR_BADTYPE)
#define	nfserr_jukebox		__constant_htonl(NFSERR_JUKEBOX)
#define	nfserr_denied		__constant_htonl(NFSERR_DENIED)
#define	nfserr_deadlock		__constant_htonl(NFSERR_DEADLOCK)
#define nfserr_expired          __constant_htonl(NFSERR_EXPIRED)
#define	nfserr_bad_cookie	__constant_htonl(NFSERR_BAD_COOKIE)
#define	nfserr_same		__constant_htonl(NFSERR_SAME)
#define	nfserr_clid_inuse	__constant_htonl(NFSERR_CLID_INUSE)
#define	nfserr_stale_clientid	__constant_htonl(NFSERR_STALE_CLIENTID)
#define	nfserr_resource		__constant_htonl(NFSERR_RESOURCE)
#define	nfserr_moved		__constant_htonl(NFSERR_MOVED)
#define	nfserr_nofilehandle	__constant_htonl(NFSERR_NOFILEHANDLE)
#define	nfserr_minor_vers_mismatch	__constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
#define nfserr_share_denied	__constant_htonl(NFSERR_SHARE_DENIED)
#define nfserr_stale_stateid	__constant_htonl(NFSERR_STALE_STATEID)
#define nfserr_old_stateid	__constant_htonl(NFSERR_OLD_STATEID)
#define nfserr_bad_stateid	__constant_htonl(NFSERR_BAD_STATEID)
#define nfserr_bad_seqid	__constant_htonl(NFSERR_BAD_SEQID)
#define	nfserr_symlink		__constant_htonl(NFSERR_SYMLINK)
#define	nfserr_not_same		__constant_htonl(NFSERR_NOT_SAME)
#define	nfserr_restorefh	__constant_htonl(NFSERR_RESTOREFH)
#define	nfserr_attrnotsupp	__constant_htonl(NFSERR_ATTRNOTSUPP)
#define	nfserr_bad_xdr		__constant_htonl(NFSERR_BAD_XDR)
#define	nfserr_openmode		__constant_htonl(NFSERR_OPENMODE)
#define	nfserr_locks_held	__constant_htonl(NFSERR_LOCKS_HELD)
#define	nfserr_op_illegal	__constant_htonl(NFSERR_OP_ILLEGAL)
#define	nfserr_grace		__constant_htonl(NFSERR_GRACE)
#define	nfserr_no_grace		__constant_htonl(NFSERR_NO_GRACE)
#define	nfserr_reclaim_bad	__constant_htonl(NFSERR_RECLAIM_BAD)
#define	nfserr_badname		__constant_htonl(NFSERR_BADNAME)
#define	nfserr_cb_path_down	__constant_htonl(NFSERR_CB_PATH_DOWN)
#define	nfserr_locked		__constant_htonl(NFSERR_LOCKED)
#define	nfserr_wrongsec		__constant_htonl(NFSERR_WRONGSEC)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
#define nfserr_badiomode		__constant_htonl(NFS4ERR_BADIOMODE)
#define nfserr_badlayout		__constant_htonl(NFS4ERR_BADLAYOUT)
#define nfserr_bad_session_digest	__constant_htonl(NFS4ERR_BAD_SESSION_DIGEST)
#define nfserr_badsession		__constant_htonl(NFS4ERR_BADSESSION)
#define nfserr_badslot			__constant_htonl(NFS4ERR_BADSLOT)
#define nfserr_complete_already		__constant_htonl(NFS4ERR_COMPLETE_ALREADY)
#define nfserr_conn_not_bound_to_session __constant_htonl(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
#define nfserr_deleg_already_wanted	__constant_htonl(NFS4ERR_DELEG_ALREADY_WANTED)
#define nfserr_back_chan_busy		__constant_htonl(NFS4ERR_BACK_CHAN_BUSY)
#define nfserr_layouttrylater		__constant_htonl(NFS4ERR_LAYOUTTRYLATER)
#define nfserr_layoutunavailable	__constant_htonl(NFS4ERR_LAYOUTUNAVAILABLE)
#define nfserr_nomatching_layout	__constant_htonl(NFS4ERR_NOMATCHING_LAYOUT)
#define nfserr_recallconflict		__constant_htonl(NFS4ERR_RECALLCONFLICT)
#define nfserr_unknown_layouttype	__constant_htonl(NFS4ERR_UNKNOWN_LAYOUTTYPE)
#define nfserr_seq_misordered		__constant_htonl(NFS4ERR_SEQ_MISORDERED)
#define nfserr_sequence_pos		__constant_htonl(NFS4ERR_SEQUENCE_POS)
#define nfserr_req_too_big		__constant_htonl(NFS4ERR_REQ_TOO_BIG)
#define nfserr_rep_too_big		__constant_htonl(NFS4ERR_REP_TOO_BIG)
#define nfserr_rep_too_big_to_cache	__constant_htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE)
#define nfserr_retry_uncached_rep	__constant_htonl(NFS4ERR_RETRY_UNCACHED_REP)
#define nfserr_unsafe_compound		__constant_htonl(NFS4ERR_UNSAFE_COMPOUND)
#define nfserr_too_many_ops		__constant_htonl(NFS4ERR_TOO_MANY_OPS)
#define nfserr_op_not_in_session	__constant_htonl(NFS4ERR_OP_NOT_IN_SESSION)
#define nfserr_hash_alg_unsupp		__constant_htonl(NFS4ERR_HASH_ALG_UNSUPP)
#define nfserr_clientid_busy		__constant_htonl(NFS4ERR_CLIENTID_BUSY)
#define nfserr_pnfs_io_hole		__constant_htonl(NFS4ERR_PNFS_IO_HOLE)
#define nfserr_seq_false_retry		__constant_htonl(NFS4ERR_SEQ_FALSE_RETRY)
#define nfserr_bad_high_slot		__constant_htonl(NFS4ERR_BAD_HIGH_SLOT)
#define nfserr_deadsession		__constant_htonl(NFS4ERR_DEADSESSION)
#define nfserr_encr_alg_unsupp		__constant_htonl(NFS4ERR_ENCR_ALG_UNSUPP)
#define nfserr_pnfs_no_layout		__constant_htonl(NFS4ERR_PNFS_NO_LAYOUT)
#define nfserr_not_only_op		__constant_htonl(NFS4ERR_NOT_ONLY_OP)
#define nfserr_wrong_cred		__constant_htonl(NFS4ERR_WRONG_CRED)
#define nfserr_wrong_type		__constant_htonl(NFS4ERR_WRONG_TYPE)
#define nfserr_dirdeleg_unavail		__constant_htonl(NFS4ERR_DIRDELEG_UNAVAIL)
#define nfserr_reject_deleg		__constant_htonl(NFS4ERR_REJECT_DELEG)
#define nfserr_returnconflict		__constant_htonl(NFS4ERR_RETURNCONFLICT)
#define nfserr_deleg_revoked		__constant_htonl(NFS4ERR_DELEG_REVOKED)
#endif
%}

/**
 * sfunction nfsderror - Convert nfsd error number into string
 * @err: errnum
 *
 * Description: This function returns a string for the error number
 * passed into the function.
 */
function nfsderror:string(err:long) 
%{
	static struct {
		int	nfserr;
		char *string;
	} nfs_errtbl[] = {
		{nfs_ok, "NFS_OK"},
		{nfserr_perm, "NFSERR_PERM"},
		{nfserr_noent, "NFSERR_NOENT"},
		{nfserr_io, "NFSERR_IO"},
		{nfserr_nxio, "NFSERR_NXIO"},
		{nfserr_eagain, "NFSERR_EAGAIN"},
		{nfserr_acces, "NFSERR_ACCES"},
		{nfserr_exist, "NFSERR_EXIST"},
		{nfserr_xdev, "NFSERR_XDEV"},
		{nfserr_nodev, "NFSERR_NODEV"},
		{nfserr_notdir, "NFSERR_NOTDIR"},
		{nfserr_isdir, "NFSERR_ISDIR"},
		{nfserr_inval, "NFSERR_INVAL"},
		{nfserr_fbig, "NFSERR_FBIG"},
		{nfserr_nospc, "NFSERR_NOSPC"},
		{nfserr_rofs, "NFSERR_ROFS"},
		{nfserr_mlink, "NFSERR_MLINK"},
		{nfserr_opnotsupp, "NFSERR_OPNOTSUPP"},
		{nfserr_nametoolong, "NFSERR_NAMETOOLONG"},
		{nfserr_notempty, "NFSERR_NOTEMPTY"},
		{nfserr_dquot, "NFSERR_DQUOT"},
		{nfserr_stale, "NFSERR_STALE"},
		{nfserr_remote, "NFSERR_REMOTE"},
		{nfserr_wflush, "NFSERR_WFLUSH"},
		{nfserr_badhandle, "NFSERR_BADHANDLE"},
		{nfserr_notsync, "NFSERR_NOT_SYNC"},
		{nfserr_badcookie, "NFSERR_BAD_COOKIE"},
		{nfserr_notsupp, "NFSERR_NOTSUPP"},
		{nfserr_toosmall, "NFSERR_TOOSMALL"},
		{nfserr_serverfault, "NFSERR_SERVERFAULT"},
		{nfserr_badtype, "NFSERR_BADTYPE"},
		{nfserr_jukebox, "NFSERR_JUKEBOX"},
		{nfserr_denied, "NFSERR_DENIED"},
		{nfserr_deadlock, "NFSERR_DEADLOCK"},
		{nfserr_expired, "NFSERR_EXPIRED"},
		{nfserr_bad_cookie, "NFSERR_BAD_COOKIE"},
		{nfserr_same, "NFSERR_SAME"},
		{nfserr_clid_inuse, "NFSERR_CLID_INUSE"},
		{nfserr_stale_clientid, "NFSERR_STALE_CLIENTID"},
		{nfserr_resource, "NFSERR_RESOURCE"},
		{nfserr_moved, "NFSERR_MOVED"},
		{nfserr_nofilehandle, "NFSERR_NOFILEHANDLE"},
		{nfserr_minor_vers_mismatch, "NFSERR_MINOR_VERS_MISMATCH"},
		{nfserr_share_denied, "NFSERR_SHARE_DENIED"},
		{nfserr_stale_stateid, "NFSERR_STALE_STATEID"},
		{nfserr_old_stateid, "NFSERR_OLD_STATEID"},
		{nfserr_bad_stateid, "NFSERR_BAD_STATEID"},
		{nfserr_bad_seqid, "NFSERR_BAD_SEQID"},
		{nfserr_symlink , "NFSERR_SYMLINK"},
		{nfserr_not_same , "NFSERR_NOT_SAME"},
		{nfserr_restorefh , "NFSERR_RESTOREFH"},
		{nfserr_attrnotsupp, "NFSERR_ATTRNOTSUPP"},
		{nfserr_bad_xdr, "NFSERR_BAD_XDR"},
		{nfserr_openmode, "NFSERR_OPENMODE"},
		{nfserr_locks_held, "NFSERR_LOCKS_HELD"},
		{nfserr_op_illegal, "NFSERR_OP_ILLEGAL"},
		{nfserr_grace, "NFSERR_GRACE"},
		{nfserr_no_grace, "NFSERR_NO_GRACE"},
		{nfserr_reclaim_bad, "NFSERR_RECLAIM_BAD"},
		{nfserr_badname, "NFSERR_BADNAME"},
		{nfserr_cb_path_down, "NFSERR_CB_PATH_DOWN"},
		{nfserr_locked, "NFSERR_LOCKED"},
		{nfserr_wrongsec, "NFSERR_WRONGSEC"},
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
		{nfserr_badiomode, "NFS4ERR_BADIOMODE"},
		{nfserr_badlayout, "NFS4ERR_BADLAYOUT"},
		{nfserr_bad_session_digest, "NFS4ERR_BAD_SESSION_DIGEST"},
		{nfserr_badsession, "NFS4ERR_BADSESSION"},
		{nfserr_badslot, "NFS4ERR_BADSLOT"},
		{nfserr_complete_already, "NFS4ERR_COMPLETE_ALREADY"},
		{nfserr_conn_not_bound_to_session, "NFS4ERR_CONN_NOT_BOUND_TO_SESSION"},
		{nfserr_deleg_already_wanted, "NFS4ERR_DELEG_ALREADY_WANTED"},
		{nfserr_back_chan_busy, "NFS4ERR_BACK_CHAN_BUSY"},
		{nfserr_layouttrylater, "NFS4ERR_LAYOUTTRYLATER"},
		{nfserr_layoutunavailable, "NFS4ERR_LAYOUTUNAVAILABLE"},
		{nfserr_nomatching_layout, "NFS4ERR_NOMATCHING_LAYOUT"},
		{nfserr_recallconflict, "NFS4ERR_RECALLCONFLICT"},
		{nfserr_unknown_layouttype, "NFS4ERR_UNKNOWN_LAYOUTTYPE"},
		{nfserr_seq_misordered, "NFS4ERR_SEQ_MISORDERED"},
		{nfserr_sequence_pos, "NFS4ERR_SEQUENCE_POS"},
		{nfserr_req_too_big, "NFS4ERR_REQ_TOO_BIG"},
		{nfserr_rep_too_big, "NFS4ERR_REP_TOO_BIG"},
		{nfserr_rep_too_big_to_cache, "NFS4ERR_REP_TOO_BIG_TO_CACHE"},
		{nfserr_retry_uncached_rep, "NFS4ERR_RETRY_UNCACHED_REP"},
		{nfserr_unsafe_compound, "NFS4ERR_UNSAFE_COMPOUND"},
		{nfserr_too_many_ops, "NFS4ERR_TOO_MANY_OPS"},
		{nfserr_op_not_in_session, "NFS4ERR_OP_NOT_IN_SESSION"},
		{nfserr_hash_alg_unsupp, "NFS4ERR_HASH_ALG_UNSUPP"},
		{nfserr_clientid_busy, "NFS4ERR_CLIENTID_BUSY"},
		{nfserr_pnfs_io_hole, "NFS4ERR_PNFS_IO_HOLE"},
		{nfserr_seq_false_retry, "NFS4ERR_SEQ_FALSE_RETRY"},
		{nfserr_bad_high_slot, "NFS4ERR_BAD_HIGH_SLOT"},
		{nfserr_deadsession, "NFS4ERR_DEADSESSION"},
		{nfserr_encr_alg_unsupp, "NFS4ERR_ENCR_ALG_UNSUPP"},
		{nfserr_pnfs_no_layout, "NFS4ERR_PNFS_NO_LAYOUT"},
		{nfserr_not_only_op, "NFS4ERR_NOT_ONLY_OP"},
		{nfserr_wrong_cred, "NFS4ERR_WRONG_CRED"},
		{nfserr_wrong_type, "NFS4ERR_WRONG_TYPE"},
		{nfserr_dirdeleg_unavail, "NFS4ERR_DIRDELEG_UNAVAIL"},
		{nfserr_reject_deleg, "NFS4ERR_REJECT_DELEG"},
		{nfserr_returnconflict, "NFS4ERR_RETURNCONFLICT"},
		{nfserr_deleg_revoked, "NFS4ERR_DELEG_REVOKED"},
#endif
	};
	int	i;
	int tabsz = (sizeof(nfs_errtbl)/sizeof(nfs_errtbl[0]));

	for (i = 0; i < tabsz; i++) {
		if (nfs_errtbl[i].nfserr == STAP_ARG_err) {
			break;
		}
	}
	if (i == tabsz)
		snprintf(STAP_RETVALUE, MAXSTRINGLEN, "nfsderr %d", ntohl(STAP_ARG_err));
	else
		snprintf(STAP_RETVALUE, MAXSTRINGLEN, 
			"nfsderr %d(%s)", ntohl(nfs_errtbl[i].nfserr), nfs_errtbl[i].string);

%}
