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
)
160 LASSERT (lcfg
!= NULL
);
161 LASSERT (index
>= 0);
163 bufcount
= lcfg
->lcfg_bufcount
;
164 if (index
>= bufcount
)
167 offset
= LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
168 for (i
= 0; i
< index
; i
++)
169 offset
+= cfs_size_round(lcfg
->lcfg_buflens
[i
]);
170 return (char *)lcfg
+ offset
;
173 static inline void lustre_cfg_bufs_init(struct lustre_cfg_bufs
*bufs
,
174 struct lustre_cfg
*lcfg
)
177 bufs
->lcfg_bufcount
= lcfg
->lcfg_bufcount
;
178 for (i
= 0; i
< bufs
->lcfg_bufcount
; i
++) {
179 bufs
->lcfg_buflen
[i
] = lcfg
->lcfg_buflens
[i
];
180 bufs
->lcfg_buf
[i
] = lustre_cfg_buf(lcfg
, i
);
184 static inline char *lustre_cfg_string(struct lustre_cfg
*lcfg
, int index
)
188 if (lcfg
->lcfg_buflens
[index
] == 0)
191 s
= lustre_cfg_buf(lcfg
, index
);
196 * make sure it's NULL terminated, even if this kills a char
197 * of data. Try to use the padding first though.
199 if (s
[lcfg
->lcfg_buflens
[index
] - 1] != '\0') {
200 int last
= min((int)lcfg
->lcfg_buflens
[index
],
201 cfs_size_round(lcfg
->lcfg_buflens
[index
]) - 1);
205 CWARN("Truncated buf %d to '%s' (lost '%c'...)\n",
212 static inline int lustre_cfg_len(__u32 bufcount
, __u32
*buflens
)
217 len
= LCFG_HDR_SIZE(bufcount
);
218 for (i
= 0; i
< bufcount
; i
++)
219 len
+= cfs_size_round(buflens
[i
]);
221 return cfs_size_round(len
);
225 #include "obd_support.h"
227 static inline struct lustre_cfg
*lustre_cfg_new(int cmd
,
228 struct lustre_cfg_bufs
*bufs
)
230 struct lustre_cfg
*lcfg
;
234 OBD_ALLOC(lcfg
, lustre_cfg_len(bufs
->lcfg_bufcount
,
237 return ERR_PTR(-ENOMEM
);
239 lcfg
->lcfg_version
= LUSTRE_CFG_VERSION
;
240 lcfg
->lcfg_command
= cmd
;
241 lcfg
->lcfg_bufcount
= bufs
->lcfg_bufcount
;
243 ptr
= (char *)lcfg
+ LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
244 for (i
= 0; i
< lcfg
->lcfg_bufcount
; i
++) {
245 lcfg
->lcfg_buflens
[i
] = bufs
->lcfg_buflen
[i
];
246 LOGL((char *)bufs
->lcfg_buf
[i
], bufs
->lcfg_buflen
[i
], ptr
);
251 static inline void lustre_cfg_free(struct lustre_cfg
*lcfg
)
255 len
= lustre_cfg_len(lcfg
->lcfg_bufcount
, lcfg
->lcfg_buflens
);
261 static inline int lustre_cfg_sanity_check(void *buf
, int len
)
263 struct lustre_cfg
*lcfg
= (struct lustre_cfg
*)buf
;
268 /* check that the first bits of the struct are valid */
269 if (len
< LCFG_HDR_SIZE(0))
272 if (lcfg
->lcfg_version
!= LUSTRE_CFG_VERSION
)
275 if (lcfg
->lcfg_bufcount
>= LUSTRE_CFG_MAX_BUFCOUNT
)
278 /* check that the buflens are valid */
279 if (len
< LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
))
282 /* make sure all the pointers point inside the data */
283 if (len
< lustre_cfg_len(lcfg
->lcfg_bufcount
, lcfg
->lcfg_buflens
))
289 #include "lustre/lustre_user.h"
293 #endif /* _LUSTRE_CFG_H */
This page took 0.0389 seconds and 5 git commands to generate.