--- /dev/null
+#!/usr/bin/env python
+
+"""
+Copyright 2019 Cray Inc. All Rights Reserved
+Utility to maps numeric opcode to string identifier
+"""
+
+from pykdump.API import *
+import argparse
+
+description_short = "Maps Lustre rpc opcodes string identifiers."
+
+opcodes = {
+ 0: 'OST_REPLY',
+ 1: 'OST_GETATTR',
+ 2: 'OST_SETATTR',
+ 3: 'OST_READ',
+ 4: 'OST_WRITE',
+ 5: 'OST_CREATE',
+ 6: 'OST_DESTROY',
+ 7: 'OST_GET_INFO',
+ 8: 'OST_CONNECT',
+ 9: 'OST_DISCONNECT',
+ 10: 'OST_PUNCH',
+ 11: 'OST_OPEN',
+ 12: 'OST_CLOSE',
+ 13: 'OST_STATFS',
+ 16: 'OST_SYNC',
+ 17: 'OST_SET_INFO',
+ 18: 'OST_QUOTACHECK',
+ 19: 'OST_QUOTACTL',
+ 20: 'OST_QUOTA_ADJUST_QUNIT', # not used since 2.4
+ 21: 'OST_LADVISE',
+
+ 33: 'MDS_GETATTR',
+ 34: 'MDS_GETATTR_NAME',
+ 35: 'MDS_CLOSE',
+ 36: 'MDS_REINT',
+ 37: 'MDS_READPAGE',
+ 38: 'MDS_CONNECT',
+ 39: 'MDS_DISCONNECT',
+ 40: 'MDS_GET_ROOT',
+ 41: 'MDS_STATFS',
+ 42: 'MDS_PIN',
+ 43: 'MDS_UNPIN', # obsolete, never used in a release
+ 44: 'MDS_SYNC',
+ 45: 'MDS_DONE_WRITING',
+ 46: 'MDS_SET_INFO',
+ 47: 'MDS_QUOTACHECK', # not used since 2.4
+ 48: 'MDS_QUOTACTL',
+ 49: 'MDS_GETXATTR',
+ 50: 'MDS_SETXATTR', # obsolete, now it's MDS_REINT op
+ 51: 'MDS_WRITEPAGE',
+ 52: 'MDS_IS_SUBDIR', # obsolete, never used in a release
+ 53: 'MDS_GET_INFO',
+ 54: 'MDS_HSM_STATE_GET',
+ 55: 'MDS_HSM_STATE_SET',
+ 56: 'MDS_HSM_ACTION',
+ 57: 'MDS_HSM_PROGRESS',
+ 58: 'MDS_HSM_REQUEST',
+ 59: 'MDS_HSM_CT_REGISTER',
+ 60: 'MDS_HSM_CT_UNREGISTER',
+ 61: 'MDS_SWAP_LAYOUTS',
+
+ 101: 'LDLM_ENQUEUE',
+ 102: 'LDLM_CONVERT',
+ 103: 'LDLM_CANCEL',
+ 104: 'LDLM_BL_CALLBACK',
+ 105: 'LDLM_CP_CALLBACK',
+ 106: 'LDLM_GL_CALLBACK',
+ 107: 'LDLM_SET_INFO',
+
+ 250: 'MGS_CONNECT',
+ 251: 'MGS_DISCONNECT',
+ 252: 'MGS_EXCEPTION', # node died, etc.
+ 253: 'MGS_TARGET_REG', # whenever target starts up
+ 254: 'MGS_TARGET_DEL',
+ 255: 'MGS_SET_INFO',
+ 256: 'MGS_CONFIG_READ',
+
+ 400: 'OBD_PING',
+ 401: 'OBD_LOG_CANCEL', # obsolete since 1.5
+ 402: 'OBD_QC_CALLBACK', # obsolete since 2.4
+ 403: 'OBD_IDX_READ',
+
+ 501: 'LLOG_ORIGIN_HANDLE_CREATE',
+ 502: 'LLOG_ORIGIN_HANDLE_NEXT_BLOCK',
+ 503: 'LLOG_ORIGIN_HANDLE_READ_HEADER',
+ 504: 'LLOG_ORIGIN_HANDLE_WRITE_REC', # Obsolete by 2.1.
+ 505: 'LLOG_ORIGIN_HANDLE_CLOSE', # Obsolete by 1.8.
+ 506: 'LLOG_ORIGIN_CONNECT', # Obsolete by 2.4.
+ 507: 'LLOG_CATINFO', # Obsolete by 2.3.
+ 508: 'LLOG_ORIGIN_HANDLE_PREV_BLOCK',
+ 509: 'LLOG_ORIGIN_HANDLE_DESTROY', # Obsolete by 2.11.
+
+ 601: 'QUOTA_DQACQ',
+ 602: 'QUOTA_DQREL',
+
+ 700: 'SEQ_QUERY',
+
+ 801: 'SEC_CTX_INIT',
+ 802: 'SEC_CTX_INIT_CONT',
+ 803: 'SEC_CTX_FINI',
+
+ 900: 'FLD_QUERY',
+ 901: 'FLD_READ',
+
+ 1000: 'OUT_UPDATE',
+
+ 1101: 'LFSCK_NOTIFY',
+ 1102: 'LFSCK_QUERY'
+}
+
+def translate_opcodes(opc_list):
+ for opc in opc_list:
+ try:
+ print "o%d \t= %s" % (opc, opcodes[opc])
+ except:
+ print "o%d \t= unknown" % opc
+
+
+if __name__ == "__main__":
+ description = "Maps one or more Lustre rpc opcodes to its string identifier."
+ parser = argparse.ArgumentParser(description=description)
+ parser.add_argument('opcode', nargs="+", type=int,
+ help="list of one or more opcodes")
+
+ args = parser.parse_args()
+ translate_opcodes(args.opcode)