]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/staging/lustre/lustre/include/lustre_cfg.h
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.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2012, Intel Corporation.
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
45 #define LUSTRE_CFG_VERSION 0x1cf60001
46 #define LUSTRE_CFG_MAX_BUFCOUNT 8
48 #define LCFG_HDR_SIZE(count) \
49 cfs_size_round(offsetof(struct lustre_cfg, lcfg_buflens[(count)]))
51 /** If the LCFG_REQUIRED bit is set in a configuration command,
52 * then the client is required to understand this parameter
53 * in order to mount the filesystem. If it does not understand
54 * a REQUIRED command the client mount will fail.
56 #define LCFG_REQUIRED 0x0001000
58 enum lcfg_command_type
{
59 LCFG_ATTACH
= 0x00cf001, /**< create a new obd instance */
60 LCFG_DETACH
= 0x00cf002, /**< destroy obd instance */
61 LCFG_SETUP
= 0x00cf003, /**< call type-specific setup */
62 LCFG_CLEANUP
= 0x00cf004, /**< call type-specific cleanup */
63 LCFG_ADD_UUID
= 0x00cf005, /**< add a nid to a niduuid */
64 LCFG_DEL_UUID
= 0x00cf006, /**< remove a nid from a niduuid */
65 LCFG_MOUNTOPT
= 0x00cf007, /**< create a profile (mdc, osc) */
66 LCFG_DEL_MOUNTOPT
= 0x00cf008, /**< destroy a profile */
67 LCFG_SET_TIMEOUT
= 0x00cf009, /**< set obd_timeout */
68 LCFG_SET_UPCALL
= 0x00cf00a, /**< deprecated */
69 LCFG_ADD_CONN
= 0x00cf00b, /**< add a failover niduuid to an obd */
70 LCFG_DEL_CONN
= 0x00cf00c, /**< remove a failover niduuid */
71 LCFG_LOV_ADD_OBD
= 0x00cf00d, /**< add an osc to a lov */
72 LCFG_LOV_DEL_OBD
= 0x00cf00e, /**< remove an osc from a lov */
73 LCFG_PARAM
= 0x00cf00f, /**< set a proc parameter */
74 LCFG_MARKER
= 0x00cf010, /**< metadata about next cfg rec */
75 LCFG_LOG_START
= 0x00ce011, /**< mgc only, process a cfg log */
76 LCFG_LOG_END
= 0x00ce012, /**< stop processing updates */
77 LCFG_LOV_ADD_INA
= 0x00ce013, /**< like LOV_ADD_OBD, inactive */
78 LCFG_ADD_MDC
= 0x00cf014, /**< add an mdc to a lmv */
79 LCFG_DEL_MDC
= 0x00cf015, /**< remove an mdc from a lmv */
80 LCFG_SPTLRPC_CONF
= 0x00ce016, /**< security */
81 LCFG_POOL_NEW
= 0x00ce020, /**< create an ost pool name */
82 LCFG_POOL_ADD
= 0x00ce021, /**< add an ost to a pool */
83 LCFG_POOL_REM
= 0x00ce022, /**< remove an ost from a pool */
84 LCFG_POOL_DEL
= 0x00ce023, /**< destroy an ost pool name */
85 LCFG_SET_LDLM_TIMEOUT
= 0x00ce030, /**< set ldlm_timeout */
86 LCFG_PRE_CLEANUP
= 0x00cf031, /**< call type-specific pre
89 LCFG_SET_PARAM
= 0x00ce032, /**< use set_param syntax to set
94 struct lustre_cfg_bufs
{
95 void *lcfg_buf
[LUSTRE_CFG_MAX_BUFCOUNT
];
96 __u32 lcfg_buflen
[LUSTRE_CFG_MAX_BUFCOUNT
];
107 __u32 lcfg_nal
; /* not used any more */
110 __u32 lcfg_buflens
[0];
113 enum cfg_record_type
{
114 PORTALS_CFG_TYPE
= 1,
115 LUSTRE_CFG_TYPE
= 123,
118 #define LUSTRE_CFG_BUFLEN(lcfg, idx) \
119 ((lcfg)->lcfg_bufcount <= (idx) \
121 : (lcfg)->lcfg_buflens[(idx)])
123 static inline void lustre_cfg_bufs_set(struct lustre_cfg_bufs
*bufs
,
128 if (index
>= LUSTRE_CFG_MAX_BUFCOUNT
)
133 if (bufs
->lcfg_bufcount
<= index
)
134 bufs
->lcfg_bufcount
= index
+ 1;
136 bufs
->lcfg_buf
[index
] = buf
;
137 bufs
->lcfg_buflen
[index
] = buflen
;
140 static inline void lustre_cfg_bufs_set_string(struct lustre_cfg_bufs
*bufs
,
144 lustre_cfg_bufs_set(bufs
, index
, str
, str
? strlen(str
) + 1 : 0);
147 static inline void lustre_cfg_bufs_reset(struct lustre_cfg_bufs
*bufs
, char *name
)
149 memset((bufs
), 0, sizeof(*bufs
));
151 lustre_cfg_bufs_set_string(bufs
, 0, name
);
154 static inline void *lustre_cfg_buf(struct lustre_cfg
*lcfg
, __u32 index
)
160 bufcount
= lcfg
->lcfg_bufcount
;
161 if (index
>= bufcount
)
164 offset
= LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
165 for (i
= 0; i
< index
; i
++)
166 offset
+= cfs_size_round(lcfg
->lcfg_buflens
[i
]);
167 return (char *)lcfg
+ offset
;
170 static inline void lustre_cfg_bufs_init(struct lustre_cfg_bufs
*bufs
,
171 struct lustre_cfg
*lcfg
)
175 bufs
->lcfg_bufcount
= lcfg
->lcfg_bufcount
;
176 for (i
= 0; i
< bufs
->lcfg_bufcount
; i
++) {
177 bufs
->lcfg_buflen
[i
] = lcfg
->lcfg_buflens
[i
];
178 bufs
->lcfg_buf
[i
] = lustre_cfg_buf(lcfg
, i
);
182 static inline char *lustre_cfg_string(struct lustre_cfg
*lcfg
, __u32 index
)
186 if (lcfg
->lcfg_buflens
[index
] == 0)
189 s
= lustre_cfg_buf(lcfg
, index
);
194 * make sure it's NULL terminated, even if this kills a char
195 * of data. Try to use the padding first though.
197 if (s
[lcfg
->lcfg_buflens
[index
] - 1] != '\0') {
198 size_t last
= min((size_t)lcfg
->lcfg_buflens
[index
],
199 cfs_size_round(lcfg
->lcfg_buflens
[index
]) - 1);
204 CWARN("Truncated buf %d to '%s' (lost '%c'...)\n",
211 static inline __u32
lustre_cfg_len(__u32 bufcount
, __u32
*buflens
)
216 len
= LCFG_HDR_SIZE(bufcount
);
217 for (i
= 0; i
< bufcount
; i
++)
218 len
+= cfs_size_round(buflens
[i
]);
220 return cfs_size_round(len
);
223 #include "obd_support.h"
225 static inline struct lustre_cfg
*lustre_cfg_new(int cmd
,
226 struct lustre_cfg_bufs
*bufs
)
228 struct lustre_cfg
*lcfg
;
232 lcfg
= kzalloc(lustre_cfg_len(bufs
->lcfg_bufcount
, bufs
->lcfg_buflen
),
235 return ERR_PTR(-ENOMEM
);
237 lcfg
->lcfg_version
= LUSTRE_CFG_VERSION
;
238 lcfg
->lcfg_command
= cmd
;
239 lcfg
->lcfg_bufcount
= bufs
->lcfg_bufcount
;
241 ptr
= (char *)lcfg
+ LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
);
242 for (i
= 0; i
< lcfg
->lcfg_bufcount
; i
++) {
243 lcfg
->lcfg_buflens
[i
] = bufs
->lcfg_buflen
[i
];
244 LOGL((char *)bufs
->lcfg_buf
[i
], bufs
->lcfg_buflen
[i
], ptr
);
249 static inline void lustre_cfg_free(struct lustre_cfg
*lcfg
)
255 static inline int lustre_cfg_sanity_check(void *buf
, size_t len
)
257 struct lustre_cfg
*lcfg
= (struct lustre_cfg
*)buf
;
262 /* check that the first bits of the struct are valid */
263 if (len
< LCFG_HDR_SIZE(0))
266 if (lcfg
->lcfg_version
!= LUSTRE_CFG_VERSION
)
269 if (lcfg
->lcfg_bufcount
>= LUSTRE_CFG_MAX_BUFCOUNT
)
272 /* check that the buflens are valid */
273 if (len
< LCFG_HDR_SIZE(lcfg
->lcfg_bufcount
))
276 /* make sure all the pointers point inside the data */
277 if (len
< lustre_cfg_len(lcfg
->lcfg_bufcount
, lcfg
->lcfg_buflens
))
283 #include "lustre/lustre_user.h"
287 #endif /* _LUSTRE_CFG_H */