4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
27 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
30 * Copyright (c) 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
49 #define LUSTRE_CFG_VERSION 0x1cf60001
50 #define LUSTRE_CFG_MAX_BUFCOUNT 8
52 #define LCFG_HDR_SIZE(count) \
53 cfs_size_round(offsetof (struct lustre_cfg, lcfg_buflens[(count)]))
55 /** If the LCFG_REQUIRED bit is set in a configuration command,
56 * then the client is required to understand this parameter
57 * in order to mount the filesystem. If it does not understand
58 * a REQUIRED command the client mount will fail. */
59 #define LCFG_REQUIRED 0x0001000
61 enum lcfg_command_type
{
62 LCFG_ATTACH
= 0x00cf001, /**< create a new obd instance */
63 LCFG_DETACH
= 0x00cf002, /**< destroy obd instance */
64 LCFG_SETUP
= 0x00cf003, /**< call type-specific setup */
65 LCFG_CLEANUP
= 0x00cf004, /**< call type-specific cleanup */
66 LCFG_ADD_UUID
= 0x00cf005, /**< add a nid to a niduuid */
67 LCFG_DEL_UUID
= 0x00cf006, /**< remove a nid from a niduuid */
68 LCFG_MOUNTOPT
= 0x00cf007, /**< create a profile (mdc, osc) */
69 LCFG_DEL_MOUNTOPT
= 0x00cf008, /**< destroy a profile */
70 LCFG_SET_TIMEOUT
= 0x00cf009, /**< set obd_timeout */
71 LCFG_SET_UPCALL
= 0x00cf00a, /**< deprecated */
72 LCFG_ADD_CONN
= 0x00cf00b, /**< add a failover niduuid to an obd */
73 LCFG_DEL_CONN
= 0x00cf00c, /**< remove a failover niduuid */
74 LCFG_LOV_ADD_OBD
= 0x00cf00d, /**< add an osc to a lov */
75 LCFG_LOV_DEL_OBD
= 0x00cf00e, /**< remove an osc from a lov */
76 LCFG_PARAM
= 0x00cf00f, /**< set a proc parameter */
77 LCFG_MARKER
= 0x00cf010, /**< metadata about next cfg rec */
78 LCFG_LOG_START
= 0x00ce011, /**< mgc only, process a cfg log */
79 LCFG_LOG_END
= 0x00ce012, /**< stop processing updates */
80 LCFG_LOV_ADD_INA
= 0x00ce013, /**< like LOV_ADD_OBD, inactive */
81 LCFG_ADD_MDC
= 0x00cf014, /**< add an mdc to a lmv */
82 LCFG_DEL_MDC
= 0x00cf015, /**< remove an mdc from a lmv */
83 LCFG_SPTLRPC_CONF
= 0x00ce016, /**< security */
84 LCFG_POOL_NEW
= 0x00ce020, /**< create an ost pool name */
85 LCFG_POOL_ADD
= 0x00ce021, /**< add an ost to a pool */
86 LCFG_POOL_REM
= 0x00ce022, /**< remove an ost from a pool */
87 LCFG_POOL_DEL
= 0x00ce023, /**< destroy an ost pool name */
88 LCFG_SET_LDLM_TIMEOUT
= 0x00ce030, /**< set ldlm_timeout */
89 LCFG_PRE_CLEANUP
= 0x00cf031, /**< call type-specific pre
91 LCFG_SET_PARAM
= 0x00ce032, /**< use set_param syntax to set
95 struct lustre_cfg_bufs
{
96 void *lcfg_buf
[LUSTRE_CFG_MAX_BUFCOUNT
];
97 __u32 lcfg_buflen
[LUSTRE_CFG_MAX_BUFCOUNT
];
108 __u32 lcfg_nal
; /* not used any more */
111 __u32 lcfg_buflens
[0];
114 enum cfg_record_type
{
115 PORTALS_CFG_TYPE
= 1,
116 LUSTRE_CFG_TYPE
= 123,
119 #define LUSTRE_CFG_BUFLEN(lcfg, idx) \
120 ((lcfg)->lcfg_bufcount <= (idx) \
122 : (lcfg)->lcfg_buflens[(idx)])
124 static inline void lustre_cfg_bufs_set(struct lustre_cfg_bufs
*bufs
,
129 if (index
>= LUSTRE_CFG_MAX_BUFCOUNT
)
134 if (bufs
->lcfg_bufcount
<= index
)
135 bufs
->lcfg_bufcount
= index
+ 1;
137 bufs
->lcfg_buf
[index
] = buf
;
138 bufs
->lcfg_buflen
[index
] = buflen
;
141 static inline void lustre_cfg_bufs_set_string(struct lustre_cfg_bufs
*bufs
,
145 lustre_cfg_bufs_set(bufs
, index
, str
, str
? strlen(str
) + 1 : 0);
148 static inline void lustre_cfg_bufs_reset(struct lustre_cfg_bufs
*bufs
, char *name
)
150 memset((bufs
), 0, sizeof(*bufs
));
152 lustre_cfg_bufs_set_string(bufs
, 0, name
);
155 static inline void *lustre_cfg_buf(struct lustre_cfg
*lcfg
, int index
)
161 LASSERT (lcfg
!= NULL
);
162 LASSERT (index
>= 0);
164 bufcount
= lcfg
->lcfg_bufcount
;
165 if (index
>= bufcount
)
168 offset
= LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
169 for (i
= 0; i
< index
; i
++)
170 offset
+= cfs_size_round(lcfg
->lcfg_buflens
[i
]);
171 return (char *)lcfg
+ offset
;
174 static inline void lustre_cfg_bufs_init(struct lustre_cfg_bufs
*bufs
,
175 struct lustre_cfg
*lcfg
)
179 bufs
->lcfg_bufcount
= lcfg
->lcfg_bufcount
;
180 for (i
= 0; i
< bufs
->lcfg_bufcount
; i
++) {
181 bufs
->lcfg_buflen
[i
] = lcfg
->lcfg_buflens
[i
];
182 bufs
->lcfg_buf
[i
] = lustre_cfg_buf(lcfg
, i
);
186 static inline char *lustre_cfg_string(struct lustre_cfg
*lcfg
, int index
)
190 if (lcfg
->lcfg_buflens
[index
] == 0)
193 s
= lustre_cfg_buf(lcfg
, index
);
198 * make sure it's NULL terminated, even if this kills a char
199 * of data. Try to use the padding first though.
201 if (s
[lcfg
->lcfg_buflens
[index
] - 1] != '\0') {
202 int last
= min((int)lcfg
->lcfg_buflens
[index
],
203 cfs_size_round(lcfg
->lcfg_buflens
[index
]) - 1);
208 CWARN("Truncated buf %d to '%s' (lost '%c'...)\n",
215 static inline int lustre_cfg_len(__u32 bufcount
, __u32
*buflens
)
220 len
= LCFG_HDR_SIZE(bufcount
);
221 for (i
= 0; i
< bufcount
; i
++)
222 len
+= cfs_size_round(buflens
[i
]);
224 return cfs_size_round(len
);
227 #include "obd_support.h"
229 static inline struct lustre_cfg
*lustre_cfg_new(int cmd
,
230 struct lustre_cfg_bufs
*bufs
)
232 struct lustre_cfg
*lcfg
;
236 lcfg
= kzalloc(lustre_cfg_len(bufs
->lcfg_bufcount
, bufs
->lcfg_buflen
),
239 return ERR_PTR(-ENOMEM
);
241 lcfg
->lcfg_version
= LUSTRE_CFG_VERSION
;
242 lcfg
->lcfg_command
= cmd
;
243 lcfg
->lcfg_bufcount
= bufs
->lcfg_bufcount
;
245 ptr
= (char *)lcfg
+ LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
246 for (i
= 0; i
< lcfg
->lcfg_bufcount
; i
++) {
247 lcfg
->lcfg_buflens
[i
] = bufs
->lcfg_buflen
[i
];
248 LOGL((char *)bufs
->lcfg_buf
[i
], bufs
->lcfg_buflen
[i
], ptr
);
253 static inline void lustre_cfg_free(struct lustre_cfg
*lcfg
)
257 len
= lustre_cfg_len(lcfg
->lcfg_bufcount
, lcfg
->lcfg_buflens
);
263 static inline int lustre_cfg_sanity_check(void *buf
, int len
)
265 struct lustre_cfg
*lcfg
= (struct lustre_cfg
*)buf
;
270 /* check that the first bits of the struct are valid */
271 if (len
< LCFG_HDR_SIZE(0))
274 if (lcfg
->lcfg_version
!= LUSTRE_CFG_VERSION
)
277 if (lcfg
->lcfg_bufcount
>= LUSTRE_CFG_MAX_BUFCOUNT
)
280 /* check that the buflens are valid */
281 if (len
< LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
))
284 /* make sure all the pointers point inside the data */
285 if (len
< lustre_cfg_len(lcfg
->lcfg_bufcount
, lcfg
->lcfg_buflens
))
291 #include "lustre/lustre_user.h"
295 #endif /* _LUSTRE_CFG_H */
This page took 0.04402 seconds and 5 git commands to generate.