/*
 * 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.
 *
 * Copyright (c) 2011, 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * lustre/include/lustre_param.h
 *
 * User-settable parameter keys
 *
 * Author: Nathan Rutman <nathan@clusterfs.com>
 */

#ifndef _LUSTRE_PARAM_H
#define _LUSTRE_PARAM_H

/** \defgroup param param
 *
 * @{
 */

/* For interoperability */
struct cfg_interop_param {
	char *old_param;
	char *new_param;
};

/* obd_config.c */
int class_find_param(char *buf, char *key, char **valp);
struct cfg_interop_param *class_find_old_param(const char *param,
					       struct cfg_interop_param *ptr);
int class_get_next_param(char **params, char *copy);
int class_match_param(char *buf, char *key, char **valp);
int class_parse_nid(char *buf, lnet_nid_t *nid, char **endh);
int class_parse_nid_quiet(char *buf, lnet_nid_t *nid, char **endh);
int class_parse_net(char *buf, __u32 *net, char **endh);
int class_match_nid(char *buf, char *key, lnet_nid_t nid);
int class_match_net(char *buf, char *key, __u32 net);
/* obd_mount.c */
int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd,
	    char *s1, char *s2, char *s3, char *s4);



/****************** User-settable parameter keys *********************/
/* e.g.
	tunefs.lustre --param="failover.node=192.168.0.13@tcp0" /dev/sda
	lctl conf_param testfs-OST0000 failover.node=3@elan,192.168.0.3@tcp0
		    ... testfs-MDT0000.lov.stripesize=4M
		    ... testfs-OST0000.ost.client_cache_seconds=15
		    ... testfs.sys.timeout=<secs>
		    ... testfs.llite.max_read_ahead_mb=16
*/

/* System global or special params not handled in obd's proc
 * See mgs_write_log_sys()
 */
#define PARAM_TIMEOUT	      "timeout="	  /* global */
#define PARAM_LDLM_TIMEOUT	 "ldlm_timeout="     /* global */
#define PARAM_AT_MIN	       "at_min="	   /* global */
#define PARAM_AT_MAX	       "at_max="	   /* global */
#define PARAM_AT_EXTRA	     "at_extra="	 /* global */
#define PARAM_AT_EARLY_MARGIN      "at_early_margin="  /* global */
#define PARAM_AT_HISTORY	   "at_history="       /* global */
#define PARAM_JOBID_VAR		   "jobid_var="	       /* global */
#define PARAM_MGSNODE	      "mgsnode="	  /* only at mounttime */
#define PARAM_FAILNODE	     "failover.node="    /* add failover nid */
#define PARAM_FAILMODE	     "failover.mode="    /* initial mount only */
#define PARAM_ACTIVE	       "active="	   /* activate/deactivate */
#define PARAM_NETWORK	      "network="	  /* bind on nid */
#define PARAM_ID_UPCALL		"identity_upcall="  /* identity upcall */

/* Prefixes for parameters handled by obd's proc methods (XXX_process_config) */
#define PARAM_OST		  "ost."
#define PARAM_OSC		  "osc."
#define PARAM_MDT		  "mdt."
#define PARAM_MDD		  "mdd."
#define PARAM_MDC		  "mdc."
#define PARAM_LLITE		"llite."
#define PARAM_LOV		  "lov."
#define PARAM_LOD		"lod."
#define PARAM_OSP		"osp."
#define PARAM_SYS		  "sys."	      /* global */
#define PARAM_SRPC		 "srpc."
#define PARAM_SRPC_FLVR	    "srpc.flavor."
#define PARAM_SRPC_UDESC	   "srpc.udesc.cli2mdt"
#define PARAM_SEC		  "security."
#define PARAM_QUOTA		"quota."	    /* global */

/** @} param */

#endif /* _LUSTRE_PARAM_H */
