/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is included * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. * * GPL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. */ #include #include #include #include #include #include #include #include #include #define DEBUG_SUBSYSTEM S_CLASS #include #ifndef BUILD_VERSION #define BUILD_VERSION "Unknown" #endif struct ctl_table_header *obd_table_header = NULL; int proc_obd_timeout SYSCTL_HANDLER_ARGS; extern unsigned int obd_dump_on_timeout; extern unsigned int obd_timeout; extern unsigned int ldlm_timeout; extern atomic_t obd_memory; int read_build_version SYSCTL_HANDLER_ARGS; SYSCTL_NODE (, OID_AUTO, lustre, CTLFLAG_RW, 0, "lustre sysctl top"); SYSCTL_PROC(_lustre, OID_AUTO, timeout, CTLTYPE_INT | CTLFLAG_RW , &obd_timeout, 0, &proc_obd_timeout, "I", "obd_timeout"); SYSCTL_PROC(_lustre, OID_AUTO, build_version, CTLTYPE_STRING | CTLFLAG_RD , NULL, 0, &read_build_version, "A", "lustre_build_version"); SYSCTL_INT(_lustre, OID_AUTO, dump_on_timeout, CTLTYPE_INT | CTLFLAG_RW, &obd_dump_on_timeout, 0, "lustre_dump_on_timeout"); SYSCTL_INT(_lustre, OID_AUTO, debug_peer_on_timeout, CTLTYPE_INT | CTLFLAG_RW, &obd_debug_peer_on_timeout, 0, "lustre_debug_peer_on_timeout"); SYSCTL_INT(_lustre, OID_AUTO, memused, CTLTYPE_INT | CTLFLAG_RW, (int *)&obd_memory.counter, 0, "lustre_memory_used"); SYSCTL_INT(_lustre, OID_AUTO, ldlm_timeout, CTLTYPE_INT | CTLFLAG_RW, &ldlm_timeout, 0, "ldlm_timeout"); static struct ctl_table parent_table[] = { &sysctl__lustre, &sysctl__lustre_timeout, &sysctl__lustre_dump_on_timeout, &sysctl__lustre_debug_peer_on_timeout, &sysctl__lustre_upcall, &sysctl__lustre_memused, &sysctl__lustre_filter_sync_on_commit, &sysctl__lustre_ldlm_timeout, }; int proc_obd_timeout SYSCTL_HANDLER_ARGS { int error = 0; error = sysctl_handle_long(oidp, oidp->oid_arg1, oidp->oid_arg2, req); if (!error && req->newptr != USER_ADDR_NULL) { if (ldlm_timeout >= obd_timeout) ldlm_timeout = max(obd_timeout / 3, 1U); } else if (req->newptr != USER_ADDR_NULL) { printf ("sysctl fail obd_timeout: %d.\n", error); } else { /* Read request */ error = SYSCTL_OUT(req, &obd_timeout, sizeof obd_timeout); } return error; } int read_build_version SYSCTL_HANDLER_ARGS { int error = 0; error = sysctl_handle_long(oidp, oidp->oid_arg1, oidp->oid_arg2, req); if ( req->newptr != USER_ADDR_NULL) { printf("sysctl read_build_version is read-only!\n"); } else { error = SYSCTL_OUT(req, BUILD_VERSION, strlen(BUILD_VERSION)); } return error; } void obd_sysctl_init (void) { #if 1 if ( !obd_table_header ) obd_table_header = register_sysctl_table(parent_table); #endif } void obd_sysctl_clean (void) { #if 1 if ( obd_table_header ) unregister_sysctl_table(obd_table_header); obd_table_header = NULL; #endif }