Whamcloud - gitweb
4dec56211f10a2e518a2530f1e250e2781525295
[fs/lustre-release.git] / lustre / include / linux / obd_class.h
1 #ifndef __LINUX_CLASS_OBD_H
2 #define __LINUX_CLASS_OBD_H
3
4 #include <linux/fs.h>
5 #include <linux/ext2_fs.h>
6 #include <linux/time.h>
7 #include <linux/obd.h>
8
9 #include <linux/obd_sim.h>
10 #include <linux/obd_snap.h>
11 /* #include <linux/obd_fc.h> */
12 #include <linux/obd_raid1.h>
13 #include <linux/obd_rpc.h>
14
15
16 #define OBD_PSDEV_MAJOR 120
17 #define MAX_OBD_DEVICES 8
18 #define MAX_MULTI 16
19
20 typedef unsigned long   objid;
21 typedef struct inode obdattr;
22 #if 0
23 struct obdattr {
24         objid                   oa_id;
25         umode_t                 oa_mode;
26         nlink_t                 oa_nlink;
27         uid_t                   oa_uid;
28         gid_t                   oa_gid;
29         off_t                   oa_size;
30         time_t                  oa_atime;
31         time_t                  oa_mtime;
32         time_t                  oa_ctime;
33         unsigned long           oa_blksize;
34         unsigned long           oa_blocks;
35         char                    oa_data[116];
36         struct obd_ops         *oa_op;
37 };
38
39 #endif
40
41 extern struct obd_device obd_dev[MAX_OBD_DEVICES];
42
43         
44
45
46
47 #define OBD_ATTACHED 0x1
48 #define OBD_SET_UP   0x2
49
50 struct obd_conn {
51         struct obd_device *oc_dev;
52         unsigned int oc_id;
53 };
54
55 /* corresponds to one of the obdx */
56 struct obd_device {
57         struct obd_type *obd_type;
58         int obd_minor;
59         int obd_flags;
60         int obd_refcnt; 
61         int obd_multi_count;
62         struct obd_conn obd_multi_conn[MAX_MULTI];
63         unsigned int obd_gen_last_id;
64         unsigned long obd_gen_prealloc_quota;
65         struct list_head obd_gen_clients;
66         union {
67                 struct ext2_obd ext2;
68                 struct raid1_obd raid1;
69                 struct snap_obd snap;
70                 struct rpc_obd rpc;
71                 /* struct fc_obd fc; */
72         } u;
73 };
74
75 struct obd_ops {
76         int (*o_attach)(struct obd_device *, int len, void *);
77         int (*o_detach)(struct obd_device *);
78         int (*o_format)(struct obd_device *, int len, void *);
79         int (*o_partition)(struct obd_device *, int len, void *);
80         int (*o_connect)(struct obd_conn *conn);
81         int (*o_disconnect)(struct obd_conn *);
82         int (*o_setup) (struct obd_device *dev, int len, void *data);
83         int (*o_cleanup)(struct obd_device *dev);
84         int (*o_setattr)(struct obd_conn *, obdattr *oa);
85         int (*o_getattr)(struct obd_conn *, obdattr *oa);
86         int (*o_statfs)(struct obd_conn *, struct statfs *statfs);
87         int (*o_create)(struct obd_conn *, int prealloc_ino, int *er);
88         int (*o_destroy)(struct obd_conn *, obdattr *oa);
89         int (*o_read)(struct obd_conn *, obdattr *ino, char *buf, unsigned long *count, loff_t offset);
90         int (*o_read2)(struct obd_conn *, obdattr *oa, char *buf, unsigned long *count, loff_t offset);
91         int (*o_write)(struct obd_conn *, obdattr *oa, char *buf, unsigned long *count, loff_t offset);
92         int (*o_brw)(int rw, struct obd_conn * conn, obdattr *obj, struct page *page, int create);
93         int (*o_preallocate)(struct obd_conn *, unsigned long *req, long inodes[32]);
94         int  (*o_get_info)(struct obd_conn *, int keylen, void *key, int *vallen, void **val);
95         int  (*o_set_info)(struct obd_conn *, int keylen, void *key, int vallen, void *val);
96         int (*o_migrate)(struct obd_conn *, obdattr *src, obdattr *dst);
97         int (*o_copy)(struct obd_conn *dev, obdattr *source, obdattr *target);
98         int (*o_iocontrol)(int cmd, struct obd_conn *, int len, void *karg, void *uarg);
99         int (*o_iterate)(struct obd_conn *, objid, int (*)(objid, void *), void *);
100
101 };
102
103 #define OBP(dev,op) dev->obd_type->typ_ops->o_ ## op
104
105 int obd_register_type(struct obd_ops *ops, char *nm);
106 int obd_unregister_type(char *nm);
107
108 struct obd_client {
109         struct list_head cli_chain;
110         struct obd_device *cli_obd;
111         unsigned int cli_id;
112         unsigned long cli_prealloc_quota;
113         struct list_head cli_prealloc_inodes;
114 };
115
116
117 struct obd_prealloc_inode {
118         struct list_head obd_prealloc_chain;
119         unsigned long inode;
120 };
121
122 /* generic operations shared by various OBD types */
123 int gen_connect (struct obd_conn *conn);
124 int gen_disconnect(struct obd_conn *conn);
125 int gen_multi_setup(struct obd_device *obddev, int len, void *data);
126 int gen_multi_cleanup(struct obd_device *obddev);
127 int gen_multi_attach(struct obd_device *obddev, int len, void *data);
128 struct obd_client *gen_client(struct obd_conn *);
129 int gen_multi_detach(struct obd_device *obddev);
130 int gen_cleanup(struct obd_device *obddev);
131 int gen_copy_data(struct obd_conn *, obdattr *source, obdattr *target);
132
133
134
135 /*
136  * ioctl commands
137  */
138 struct oic_generic {
139         int  att_connid;
140         int  att_typelen;
141         void *att_type;
142         int  att_datalen;
143         void *att_data;
144 };
145
146 struct oic_prealloc_s {
147         unsigned long cli_id;
148         unsigned long alloc; /* user sets it to the number of inodes requesting
149                      * to be preallocated.  kernel sets it to the actual number
150                      * of succesfully preallocated inodes */
151         long inodes[32]; /* actual inode numbers */
152 };
153
154 struct oic_create_s {
155         unsigned int conn_id;
156         unsigned long prealloc;
157 };
158
159 struct oic_attr_s {
160         unsigned int conn_id;
161         unsigned long ino;
162         struct iattr iattr;
163 };
164
165 struct ioc_mv_s {
166         unsigned int conn_id;
167         objid  src;
168         objid  tgt;
169 };
170
171 struct oic_rw_s {
172         unsigned int conn_id;
173         unsigned long id;
174         char * buf;
175         unsigned long count;
176         loff_t offset;
177 };
178
179 struct oic_partition {
180         int partition;
181         unsigned int size;
182 };
183
184
185 #define OBD_IOC_CREATE                 _IOR ('f',  3, long)
186 #define OBD_IOC_SETUP                  _IOW ('f',  4, long)
187 #define OBD_IOC_CLEANUP                _IO  ('f',  5      )
188 #define OBD_IOC_DESTROY                _IOW ('f',  6, long)
189 #define OBD_IOC_PREALLOCATE            _IOWR('f',  7, long)
190 #define OBD_IOC_DEC_USE_COUNT          _IO  ('f',  8      )
191 #define OBD_IOC_SETATTR                _IOW ('f',  9, long)
192 #define OBD_IOC_GETATTR                _IOR ('f', 10, long)
193 #define OBD_IOC_READ                   _IOWR('f', 11, long)
194 #define OBD_IOC_WRITE                  _IOWR('f', 12, long)
195 #define OBD_IOC_CONNECT                _IOR ('f', 13, long)
196 #define OBD_IOC_DISCONNECT             _IOW ('f', 14, long)
197 #define OBD_IOC_STATFS                 _IOWR('f', 15, long)
198 #define OBD_IOC_SYNC                   _IOR ('f',  16, long)
199 #define OBD_IOC_READ2                  _IOWR('f', 17, long)
200 #define OBD_IOC_FORMAT                 _IOWR('f', 18, long)
201 #define OBD_IOC_PARTITION              _IOWR('f', 19, long)
202 #define OBD_IOC_ATTACH                 _IOWR('f', 20, long)
203 #define OBD_IOC_DETACH                 _IOWR('f', 21, long)
204 #define OBD_IOC_COPY                   _IOWR('f', 22, long)
205 #define OBD_IOC_MIGR                   _IOWR('f', 23, long)
206
207 #define OBD_IOC_DEC_FS_USE_COUNT       _IO  ('f', 32      )
208
209
210 /* sysctl.c */
211 extern void obd_sysctl_init (void);
212 extern void obd_sysctl_clean (void);
213
214 #define CHKCONN(conn)   do { if (!gen_client(conn)) {\
215                 printk("%s %d invalid client %u\n", __FILE__, __LINE__, \
216                        conn->oc_id);\
217                 return -EINVAL; }} while (0) 
218
219
220 /* support routines */
221 static __inline__ obdattr *obd_empty_oa(void)
222 {
223         obdattr *res = NULL;
224         OBD_ALLOC(res, obdattr *, sizeof(*res));
225         return res;
226 }
227
228 static __inline__ void obd_free_oa(obdattr *oa)
229 {
230         if ( !oa ) 
231                 return;
232         OBD_FREE(oa,sizeof(*oa));
233 }
234
235
236
237 static __inline__ obdattr *obd_oa_fromid(struct obd_conn *conn,  objid id)
238 {
239         obdattr *res = NULL;
240
241         OBD_ALLOC(res, obdattr *, sizeof(*res));
242         if ( !res ) 
243                 return NULL;
244         memset(res, 0, sizeof(*res));
245         res->i_ino = id;
246         if (conn->oc_dev->obd_type->typ_ops->o_getattr(conn, res)) {
247                 OBD_FREE(res, sizeof(*res));
248                 return NULL;
249         }
250         
251         return res;
252 }
253
254 /* #define obd_cpy_obdo(a,b) memcpy(a, b, sizeof(*a)) */
255
256 static __inline__ void obd_cpy_appmd(obdattr *a, obdattr *b)
257 {
258         a->i_mode = b->i_mode;
259         a->i_uid = b->i_uid;
260         a->i_gid = b->i_gid;
261         a->i_size = b->i_size;
262         a->i_atime = b->i_atime;
263         a->i_mtime = b->i_mtime;
264         a->i_ctime = b->i_ctime;
265         a->i_flags = b->i_flags;
266         /* allocation of space */
267         a->i_blocks = b->i_blocks;
268 }
269
270 #endif /* __LINUX_CLASS_OBD_H */