1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#ifndef _LUSTRE_LIB_H
42#define _LUSTRE_LIB_H
43
44
45
46
47
48
49#include <linux/sched.h>
50#include <linux/signal.h>
51#include <linux/types.h>
52#include "../../include/linux/libcfs/libcfs.h"
53#include "lustre/lustre_idl.h"
54#include "lustre_ver.h"
55#include "lustre_cfg.h"
56
57
58struct kstatfs;
59struct ptlrpc_request;
60struct obd_export;
61struct lu_target;
62struct l_wait_info;
63#include "lustre_ha.h"
64#include "lustre_net.h"
65
66#define LI_POISON 0x5a5a5a5a
67#if BITS_PER_LONG > 32
68# define LL_POISON 0x5a5a5a5a5a5a5a5aL
69#else
70# define LL_POISON 0x5a5a5a5aL
71#endif
72#define LP_POISON ((void *)LL_POISON)
73
74int target_pack_pool_reply(struct ptlrpc_request *req);
75int do_set_info_async(struct obd_import *imp,
76 int opcode, int version,
77 u32 keylen, void *key,
78 u32 vallen, void *val,
79 struct ptlrpc_request_set *set);
80
81#define OBD_RECOVERY_MAX_TIME (obd_timeout * 18)
82#define OBD_MAX_IOCTL_BUFFER CONFIG_LUSTRE_OBD_MAX_IOCTL_BUFFER
83
84void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id);
85
86
87
88int client_sanobd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg);
89struct client_obd *client_conn2cli(struct lustre_handle *conn);
90
91struct md_open_data;
92struct obd_client_handle {
93 struct lustre_handle och_fh;
94 struct lu_fid och_fid;
95 struct md_open_data *och_mod;
96 struct lustre_handle och_lease_handle;
97 __u32 och_magic;
98 fmode_t och_flags;
99};
100
101#define OBD_CLIENT_HANDLE_MAGIC 0xd15ea5ed
102
103
104void statfs_unpack(struct kstatfs *sfs, struct obd_statfs *osfs);
105
106
107
108
109enum md_echo_cmd {
110 ECHO_MD_CREATE = 1,
111 ECHO_MD_MKDIR = 2,
112 ECHO_MD_DESTROY = 3,
113 ECHO_MD_RMDIR = 4,
114 ECHO_MD_LOOKUP = 5,
115 ECHO_MD_GETATTR = 6,
116 ECHO_MD_SETATTR = 7,
117 ECHO_MD_ALLOC_FID = 8,
118};
119
120
121
122
123#define OBD_IOCTL_VERSION 0x00010004
124
125struct obd_ioctl_data {
126 __u32 ioc_len;
127 __u32 ioc_version;
128
129 union {
130 __u64 ioc_cookie;
131 __u64 ioc_u64_1;
132 };
133 union {
134 __u32 ioc_conn1;
135 __u32 ioc_u32_1;
136 };
137 union {
138 __u32 ioc_conn2;
139 __u32 ioc_u32_2;
140 };
141
142 struct obdo ioc_obdo1;
143 struct obdo ioc_obdo2;
144
145 u64 ioc_count;
146 u64 ioc_offset;
147 __u32 ioc_dev;
148 __u32 ioc_command;
149
150 __u64 ioc_nid;
151 __u32 ioc_nal;
152 __u32 ioc_type;
153
154
155 __u32 ioc_plen1;
156 void __user *ioc_pbuf1;
157 __u32 ioc_plen2;
158 void __user *ioc_pbuf2;
159
160
161 __u32 ioc_inllen1;
162 char *ioc_inlbuf1;
163 __u32 ioc_inllen2;
164 char *ioc_inlbuf2;
165 __u32 ioc_inllen3;
166 char *ioc_inlbuf3;
167 __u32 ioc_inllen4;
168 char *ioc_inlbuf4;
169
170 char ioc_bulk[0];
171};
172
173struct obd_ioctl_hdr {
174 __u32 ioc_len;
175 __u32 ioc_version;
176};
177
178static inline int obd_ioctl_packlen(struct obd_ioctl_data *data)
179{
180 int len = cfs_size_round(sizeof(struct obd_ioctl_data));
181
182 len += cfs_size_round(data->ioc_inllen1);
183 len += cfs_size_round(data->ioc_inllen2);
184 len += cfs_size_round(data->ioc_inllen3);
185 len += cfs_size_round(data->ioc_inllen4);
186 return len;
187}
188
189static inline int obd_ioctl_is_invalid(struct obd_ioctl_data *data)
190{
191 if (data->ioc_len > OBD_MAX_IOCTL_BUFFER) {
192 CERROR("OBD ioctl: ioc_len larger than %d\n",
193 OBD_MAX_IOCTL_BUFFER);
194 return 1;
195 }
196 if (data->ioc_inllen1 > OBD_MAX_IOCTL_BUFFER) {
197 CERROR("OBD ioctl: ioc_inllen1 larger than ioc_len\n");
198 return 1;
199 }
200 if (data->ioc_inllen2 > OBD_MAX_IOCTL_BUFFER) {
201 CERROR("OBD ioctl: ioc_inllen2 larger than ioc_len\n");
202 return 1;
203 }
204 if (data->ioc_inllen3 > OBD_MAX_IOCTL_BUFFER) {
205 CERROR("OBD ioctl: ioc_inllen3 larger than ioc_len\n");
206 return 1;
207 }
208 if (data->ioc_inllen4 > OBD_MAX_IOCTL_BUFFER) {
209 CERROR("OBD ioctl: ioc_inllen4 larger than ioc_len\n");
210 return 1;
211 }
212 if (data->ioc_inlbuf1 && !data->ioc_inllen1) {
213 CERROR("OBD ioctl: inlbuf1 pointer but 0 length\n");
214 return 1;
215 }
216 if (data->ioc_inlbuf2 && !data->ioc_inllen2) {
217 CERROR("OBD ioctl: inlbuf2 pointer but 0 length\n");
218 return 1;
219 }
220 if (data->ioc_inlbuf3 && !data->ioc_inllen3) {
221 CERROR("OBD ioctl: inlbuf3 pointer but 0 length\n");
222 return 1;
223 }
224 if (data->ioc_inlbuf4 && !data->ioc_inllen4) {
225 CERROR("OBD ioctl: inlbuf4 pointer but 0 length\n");
226 return 1;
227 }
228 if (data->ioc_pbuf1 && !data->ioc_plen1) {
229 CERROR("OBD ioctl: pbuf1 pointer but 0 length\n");
230 return 1;
231 }
232 if (data->ioc_pbuf2 && !data->ioc_plen2) {
233 CERROR("OBD ioctl: pbuf2 pointer but 0 length\n");
234 return 1;
235 }
236 if (data->ioc_plen1 && !data->ioc_pbuf1) {
237 CERROR("OBD ioctl: plen1 set but NULL pointer\n");
238 return 1;
239 }
240 if (data->ioc_plen2 && !data->ioc_pbuf2) {
241 CERROR("OBD ioctl: plen2 set but NULL pointer\n");
242 return 1;
243 }
244 if (obd_ioctl_packlen(data) > data->ioc_len) {
245 CERROR("OBD ioctl: packlen exceeds ioc_len (%d > %d)\n",
246 obd_ioctl_packlen(data), data->ioc_len);
247 return 1;
248 }
249 return 0;
250}
251
252#include "obd_support.h"
253
254
255int obd_ioctl_getdata(char **buf, int *len, void __user *arg);
256int obd_ioctl_popdata(void __user *arg, void *data, int len);
257
258static inline void obd_ioctl_freedata(char *buf, int len)
259{
260 kvfree(buf);
261 return;
262}
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280#define OBD_IOC_DATA_TYPE long
281
282#define OBD_IOC_CREATE _IOWR('f', 101, OBD_IOC_DATA_TYPE)
283#define OBD_IOC_DESTROY _IOW ('f', 104, OBD_IOC_DATA_TYPE)
284#define OBD_IOC_PREALLOCATE _IOWR('f', 105, OBD_IOC_DATA_TYPE)
285
286#define OBD_IOC_SETATTR _IOW ('f', 107, OBD_IOC_DATA_TYPE)
287#define OBD_IOC_GETATTR _IOWR ('f', 108, OBD_IOC_DATA_TYPE)
288#define OBD_IOC_READ _IOWR('f', 109, OBD_IOC_DATA_TYPE)
289#define OBD_IOC_WRITE _IOWR('f', 110, OBD_IOC_DATA_TYPE)
290
291#define OBD_IOC_STATFS _IOWR('f', 113, OBD_IOC_DATA_TYPE)
292#define OBD_IOC_SYNC _IOW ('f', 114, OBD_IOC_DATA_TYPE)
293#define OBD_IOC_READ2 _IOWR('f', 115, OBD_IOC_DATA_TYPE)
294#define OBD_IOC_FORMAT _IOWR('f', 116, OBD_IOC_DATA_TYPE)
295#define OBD_IOC_PARTITION _IOWR('f', 117, OBD_IOC_DATA_TYPE)
296#define OBD_IOC_COPY _IOWR('f', 120, OBD_IOC_DATA_TYPE)
297#define OBD_IOC_MIGR _IOWR('f', 121, OBD_IOC_DATA_TYPE)
298#define OBD_IOC_PUNCH _IOWR('f', 122, OBD_IOC_DATA_TYPE)
299
300#define OBD_IOC_MODULE_DEBUG _IOWR('f', 124, OBD_IOC_DATA_TYPE)
301#define OBD_IOC_BRW_READ _IOWR('f', 125, OBD_IOC_DATA_TYPE)
302#define OBD_IOC_BRW_WRITE _IOWR('f', 126, OBD_IOC_DATA_TYPE)
303#define OBD_IOC_NAME2DEV _IOWR('f', 127, OBD_IOC_DATA_TYPE)
304#define OBD_IOC_UUID2DEV _IOWR('f', 130, OBD_IOC_DATA_TYPE)
305
306#define OBD_IOC_GETNAME _IOWR('f', 131, OBD_IOC_DATA_TYPE)
307#define OBD_IOC_GETMDNAME _IOR('f', 131, char[MAX_OBD_NAME])
308#define OBD_IOC_GETDTNAME OBD_IOC_GETNAME
309
310#define OBD_IOC_LOV_GET_CONFIG _IOWR('f', 132, OBD_IOC_DATA_TYPE)
311#define OBD_IOC_CLIENT_RECOVER _IOW ('f', 133, OBD_IOC_DATA_TYPE)
312#define OBD_IOC_PING_TARGET _IOW ('f', 136, OBD_IOC_DATA_TYPE)
313
314#define OBD_IOC_DEC_FS_USE_COUNT _IO ('f', 139)
315#define OBD_IOC_NO_TRANSNO _IOW ('f', 140, OBD_IOC_DATA_TYPE)
316#define OBD_IOC_SET_READONLY _IOW ('f', 141, OBD_IOC_DATA_TYPE)
317#define OBD_IOC_ABORT_RECOVERY _IOR ('f', 142, OBD_IOC_DATA_TYPE)
318
319#define OBD_IOC_ROOT_SQUASH _IOWR('f', 143, OBD_IOC_DATA_TYPE)
320
321#define OBD_GET_VERSION _IOWR ('f', 144, OBD_IOC_DATA_TYPE)
322
323#define OBD_IOC_GSS_SUPPORT _IOWR('f', 145, OBD_IOC_DATA_TYPE)
324
325#define OBD_IOC_CLOSE_UUID _IOWR ('f', 147, OBD_IOC_DATA_TYPE)
326
327#define OBD_IOC_CHANGELOG_SEND _IOW ('f', 148, OBD_IOC_DATA_TYPE)
328#define OBD_IOC_GETDEVICE _IOWR ('f', 149, OBD_IOC_DATA_TYPE)
329#define OBD_IOC_FID2PATH _IOWR ('f', 150, OBD_IOC_DATA_TYPE)
330
331
332#define OBD_IOC_LOV_SETSTRIPE _IOW ('f', 154, OBD_IOC_DATA_TYPE)
333
334#define OBD_IOC_LOV_GETSTRIPE _IOW ('f', 155, OBD_IOC_DATA_TYPE)
335
336#define OBD_IOC_LOV_SETEA _IOW ('f', 156, OBD_IOC_DATA_TYPE)
337
338
339#define OBD_IOC_QUOTACHECK _IOW ('f', 160, int)
340
341#define OBD_IOC_POLL_QUOTACHECK _IOR ('f', 161, struct if_quotacheck *)
342
343#define OBD_IOC_QUOTACTL _IOWR('f', 162, struct if_quotactl)
344
345#define OBD_IOC_CHANGELOG_REG _IOW ('f', 177, struct obd_ioctl_data)
346#define OBD_IOC_CHANGELOG_DEREG _IOW ('f', 178, struct obd_ioctl_data)
347#define OBD_IOC_CHANGELOG_CLEAR _IOW ('f', 179, struct obd_ioctl_data)
348#define OBD_IOC_RECORD _IOWR('f', 180, OBD_IOC_DATA_TYPE)
349#define OBD_IOC_ENDRECORD _IOWR('f', 181, OBD_IOC_DATA_TYPE)
350#define OBD_IOC_PARSE _IOWR('f', 182, OBD_IOC_DATA_TYPE)
351#define OBD_IOC_DORECORD _IOWR('f', 183, OBD_IOC_DATA_TYPE)
352#define OBD_IOC_PROCESS_CFG _IOWR('f', 184, OBD_IOC_DATA_TYPE)
353#define OBD_IOC_DUMP_LOG _IOWR('f', 185, OBD_IOC_DATA_TYPE)
354#define OBD_IOC_CLEAR_LOG _IOWR('f', 186, OBD_IOC_DATA_TYPE)
355#define OBD_IOC_PARAM _IOW ('f', 187, OBD_IOC_DATA_TYPE)
356#define OBD_IOC_POOL _IOWR('f', 188, OBD_IOC_DATA_TYPE)
357#define OBD_IOC_REPLACE_NIDS _IOWR('f', 189, OBD_IOC_DATA_TYPE)
358
359#define OBD_IOC_CATLOGLIST _IOWR('f', 190, OBD_IOC_DATA_TYPE)
360#define OBD_IOC_LLOG_INFO _IOWR('f', 191, OBD_IOC_DATA_TYPE)
361#define OBD_IOC_LLOG_PRINT _IOWR('f', 192, OBD_IOC_DATA_TYPE)
362#define OBD_IOC_LLOG_CANCEL _IOWR('f', 193, OBD_IOC_DATA_TYPE)
363#define OBD_IOC_LLOG_REMOVE _IOWR('f', 194, OBD_IOC_DATA_TYPE)
364#define OBD_IOC_LLOG_CHECK _IOWR('f', 195, OBD_IOC_DATA_TYPE)
365
366#define OBD_IOC_LLOG_CATINFO _IOWR('f', 196, OBD_IOC_DATA_TYPE)
367
368
369
370
371
372
373#define OBD_IOC_GET_OBJ_VERSION _IOR('f', 210, OBD_IOC_DATA_TYPE)
374
375
376#define OBD_IOC_GET_MNTOPT _IOW('f', 220, mntopt_t)
377
378#define OBD_IOC_ECHO_MD _IOR('f', 221, struct obd_ioctl_data)
379#define OBD_IOC_ECHO_ALLOC_SEQ _IOWR('f', 222, struct obd_ioctl_data)
380
381#define OBD_IOC_START_LFSCK _IOWR('f', 230, OBD_IOC_DATA_TYPE)
382#define OBD_IOC_STOP_LFSCK _IOW('f', 231, OBD_IOC_DATA_TYPE)
383#define OBD_IOC_PAUSE_LFSCK _IOW('f', 232, OBD_IOC_DATA_TYPE)
384
385
386
387
388
389
390
391
392#define LUSTRE_STRIPE_MAXBYTES 0x1fffffff000ULL
393
394
395#define LOVEA_DELETE_VALUES(size, count, offset) (size == 0 && count == 0 && \
396 offset == (typeof(offset))(-1))
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464static inline int back_to_sleep(void *arg)
465{
466 return 0;
467}
468
469#define LWI_ON_SIGNAL_NOOP ((void (*)(void *))(-1))
470
471struct l_wait_info {
472 long lwi_timeout;
473 long lwi_interval;
474 int lwi_allow_intr;
475 int (*lwi_on_timeout)(void *);
476 void (*lwi_on_signal)(void *);
477 void *lwi_cb_data;
478};
479
480
481#define LWI_TIMEOUT(time, cb, data) \
482((struct l_wait_info) { \
483 .lwi_timeout = time, \
484 .lwi_on_timeout = cb, \
485 .lwi_cb_data = data, \
486 .lwi_interval = 0, \
487 .lwi_allow_intr = 0 \
488})
489
490#define LWI_TIMEOUT_INTERVAL(time, interval, cb, data) \
491((struct l_wait_info) { \
492 .lwi_timeout = time, \
493 .lwi_on_timeout = cb, \
494 .lwi_cb_data = data, \
495 .lwi_interval = interval, \
496 .lwi_allow_intr = 0 \
497})
498
499#define LWI_TIMEOUT_INTR(time, time_cb, sig_cb, data) \
500((struct l_wait_info) { \
501 .lwi_timeout = time, \
502 .lwi_on_timeout = time_cb, \
503 .lwi_on_signal = sig_cb, \
504 .lwi_cb_data = data, \
505 .lwi_interval = 0, \
506 .lwi_allow_intr = 0 \
507})
508
509#define LWI_TIMEOUT_INTR_ALL(time, time_cb, sig_cb, data) \
510((struct l_wait_info) { \
511 .lwi_timeout = time, \
512 .lwi_on_timeout = time_cb, \
513 .lwi_on_signal = sig_cb, \
514 .lwi_cb_data = data, \
515 .lwi_interval = 0, \
516 .lwi_allow_intr = 1 \
517})
518
519#define LWI_INTR(cb, data) LWI_TIMEOUT_INTR(0, NULL, cb, data)
520
521#define LUSTRE_FATAL_SIGS (sigmask(SIGKILL) | sigmask(SIGINT) | \
522 sigmask(SIGTERM) | sigmask(SIGQUIT) | \
523 sigmask(SIGALRM))
524
525
526
527
528
529#define __l_wait_event(wq, condition, info, ret, l_add_wait) \
530do { \
531 wait_queue_t __wait; \
532 long __timeout = info->lwi_timeout; \
533 sigset_t __blocked; \
534 int __allow_intr = info->lwi_allow_intr; \
535 \
536 ret = 0; \
537 if (condition) \
538 break; \
539 \
540 init_waitqueue_entry(&__wait, current); \
541 l_add_wait(&wq, &__wait); \
542 \
543 \
544 if (info->lwi_on_signal && (__timeout == 0 || __allow_intr)) \
545 __blocked = cfs_block_sigsinv(LUSTRE_FATAL_SIGS); \
546 else \
547 __blocked = cfs_block_sigsinv(0); \
548 \
549 for (;;) { \
550 if (condition) \
551 break; \
552 \
553 set_current_state(TASK_INTERRUPTIBLE); \
554 \
555 if (__timeout == 0) { \
556 schedule(); \
557 } else { \
558 long interval = info->lwi_interval ? \
559 min_t(long, \
560 info->lwi_interval, __timeout) : \
561 __timeout; \
562 long remaining = schedule_timeout(interval);\
563 __timeout = cfs_time_sub(__timeout, \
564 cfs_time_sub(interval, remaining));\
565 if (__timeout == 0) { \
566 if (!info->lwi_on_timeout || \
567 info->lwi_on_timeout(info->lwi_cb_data)) { \
568 ret = -ETIMEDOUT; \
569 break; \
570 } \
571 \
572 if (info->lwi_on_signal) \
573 (void)cfs_block_sigsinv(LUSTRE_FATAL_SIGS);\
574 } \
575 } \
576 \
577 set_current_state(TASK_RUNNING); \
578 \
579 if (condition) \
580 break; \
581 if (cfs_signal_pending()) { \
582 if (info->lwi_on_signal && \
583 (__timeout == 0 || __allow_intr)) { \
584 if (info->lwi_on_signal != LWI_ON_SIGNAL_NOOP) \
585 info->lwi_on_signal(info->lwi_cb_data);\
586 ret = -EINTR; \
587 break; \
588 } \
589 \
590 \
591 \
592 \
593 \
594 \
595 \
596 cfs_clear_sigpending(); \
597 } \
598 } \
599 \
600 cfs_restore_sigs(__blocked); \
601 \
602 remove_wait_queue(&wq, &__wait); \
603} while (0)
604
605#define l_wait_event(wq, condition, info) \
606({ \
607 int __ret; \
608 struct l_wait_info *__info = (info); \
609 \
610 __l_wait_event(wq, condition, __info, \
611 __ret, add_wait_queue); \
612 __ret; \
613})
614
615#define l_wait_event_exclusive(wq, condition, info) \
616({ \
617 int __ret; \
618 struct l_wait_info *__info = (info); \
619 \
620 __l_wait_event(wq, condition, __info, \
621 __ret, add_wait_queue_exclusive); \
622 __ret; \
623})
624
625#define l_wait_event_exclusive_head(wq, condition, info) \
626({ \
627 int __ret; \
628 struct l_wait_info *__info = (info); \
629 \
630 __l_wait_event(wq, condition, __info, \
631 __ret, add_wait_queue_exclusive_head); \
632 __ret; \
633})
634
635#define l_wait_condition(wq, condition) \
636({ \
637 struct l_wait_info lwi = { 0 }; \
638 l_wait_event(wq, condition, &lwi); \
639})
640
641#define l_wait_condition_exclusive(wq, condition) \
642({ \
643 struct l_wait_info lwi = { 0 }; \
644 l_wait_event_exclusive(wq, condition, &lwi); \
645})
646
647#define l_wait_condition_exclusive_head(wq, condition) \
648({ \
649 struct l_wait_info lwi = { 0 }; \
650 l_wait_event_exclusive_head(wq, condition, &lwi); \
651})
652
653#define LIBLUSTRE_CLIENT (0)
654
655
656
657#endif
658