Whamcloud - gitweb
640f6911ad0bcba816d649b5fb38469130103bc9
[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
99 };
100
101 #define OBP(dev,op) dev->obd_type->typ_ops->o_ ## op
102
103 int obd_register_type(struct obd_ops *ops, char *nm);
104 int obd_unregister_type(char *nm);
105
106 struct obd_client {
107         struct list_head cli_chain;
108         struct obd_device *cli_obd;
109         unsigned int cli_id;
110         unsigned long cli_prealloc_quota;
111         struct list_head cli_prealloc_inodes;
112 };
113
114
115 struct obd_prealloc_inode {
116         struct list_head obd_prealloc_chain;
117         unsigned long inode;
118 };
119
120 /* generic operations shared by various OBD types */
121 int gen_connect (struct obd_conn *conn);
122 int gen_disconnect(struct obd_conn *conn);
123 int gen_multi_setup(struct obd_device *obddev, int len, void *data);
124 int gen_multi_cleanup(struct obd_device *obddev);
125 int gen_multi_attach(struct obd_device *obddev, int len, void *data);
126 struct obd_client *gen_client(struct obd_conn *);
127 int gen_multi_detach(struct obd_device *obddev);
128 int gen_cleanup(struct obd_device *obddev);
129 int gen_copy_data(struct obd_conn *, obdattr *source, obdattr *target);
130
131
132
133 /*
134  * ioctl commands
135  */
136 struct oic_attach {
137         int  att_typelen;
138         void *att_type;
139         int  att_datalen;
140         void *att_data;
141 };
142
143 struct oic_prealloc_s {
144         unsigned long cli_id;
145         unsigned long alloc; /* user sets it to the number of inodes requesting
146                      * to be preallocated.  kernel sets it to the actual number
147                      * of succesfully preallocated inodes */
148         long inodes[32]; /* actual inode numbers */
149 };
150
151 struct oic_create_s {
152         unsigned int conn_id;
153         unsigned long prealloc;
154 };
155
156 struct oic_attr_s {
157         unsigned int conn_id;
158         unsigned long ino;
159         struct iattr iattr;
160 };
161
162 struct ioc_mv_s {
163         unsigned int conn_id;
164         objid  src;
165         objid  tgt;
166 };
167
168 struct oic_rw_s {
169         unsigned int conn_id;
170         unsigned long id;
171         char * buf;
172         unsigned long count;
173         loff_t offset;
174 };
175
176 struct oic_partition {
177         int partition;
178         unsigned int size;
179 };
180
181
182 #define OBD_IOC_CREATE                 _IOR ('f',  3, long)
183 #define OBD_IOC_SETUP                  _IOW ('f',  4, long)
184 #define OBD_IOC_CLEANUP                _IO  ('f',  5      )
185 #define OBD_IOC_DESTROY                _IOW ('f',  6, long)
186 #define OBD_IOC_PREALLOCATE            _IOWR('f',  7, long)
187 #define OBD_IOC_DEC_USE_COUNT          _IO  ('f',  8      )
188 #define OBD_IOC_SETATTR                _IOW ('f',  9, long)
189 #define OBD_IOC_GETATTR                _IOR ('f', 10, long)
190 #define OBD_IOC_READ                   _IOWR('f', 11, long)
191 #define OBD_IOC_WRITE                  _IOWR('f', 12, long)
192 #define OBD_IOC_CONNECT                _IOR ('f', 13, long)
193 #define OBD_IOC_DISCONNECT             _IOW ('f', 14, long)
194 #define OBD_IOC_STATFS                 _IOWR('f', 15, long)
195 #define OBD_IOC_SYNC                   _IOR ('f',  16, long)
196 #define OBD_IOC_READ2                  _IOWR('f', 17, long)
197 #define OBD_IOC_FORMAT                 _IOWR('f', 18, long)
198 #define OBD_IOC_PARTITION              _IOWR('f', 19, long)
199 #define OBD_IOC_ATTACH                 _IOWR('f', 20, long)
200 #define OBD_IOC_DETACH                 _IOWR('f', 21, long)
201 #define OBD_IOC_COPY                   _IOWR('f', 22, long)
202 #define OBD_IOC_MIGR                   _IOWR('f', 23, long)
203
204 #define OBD_IOC_DEC_FS_USE_COUNT       _IO  ('f', 32      )
205
206
207 /* sysctl.c */
208 extern void obd_sysctl_init (void);
209 extern void obd_sysctl_clean (void);
210
211 #define CHKCONN(conn)   do { if (!gen_client(conn)) {\
212                 printk("%s %d invalid client %u\n", __FILE__, __LINE__, \
213                        conn->oc_id);\
214                 return -EINVAL; }} while (0) 
215
216
217 /* support routines */
218 static __inline__ obdattr *obd_empty_oa(void)
219 {
220         obdattr *res = NULL;
221         OBD_ALLOC(res, obdattr *, sizeof(*res));
222         return res;
223 }
224
225 static __inline__ void obd_free_oa(obdattr *oa)
226 {
227         if ( !oa ) 
228                 return;
229         OBD_FREE(oa,sizeof(*oa));
230 }
231
232
233
234 static __inline__ obdattr *obd_oa_fromid(struct obd_conn *conn,  objid id)
235 {
236         obdattr *res = NULL;
237
238         OBD_ALLOC(res, obdattr *, sizeof(*res));
239         if ( !res ) 
240                 return NULL;
241         memset(res, 0, sizeof(*res));
242         res->i_ino = id;
243         if (conn->oc_dev->obd_type->typ_ops->o_getattr(conn, res)) {
244                 OBD_FREE(res, sizeof(*res));
245                 return NULL;
246         }
247         
248         return res;
249 }
250
251 /* #define obd_cpy_obdo(a,b) memcpy(a, b, sizeof(*a)) */
252
253 static __inline__ void obd_cpy_appmd(obdattr *a, obdattr *b)
254 {
255         a->i_mode = b->i_mode;
256         a->i_uid = b->i_uid;
257         a->i_gid = b->i_gid;
258         a->i_size = b->i_size;
259         a->i_atime = b->i_atime;
260         a->i_mtime = b->i_mtime;
261         a->i_ctime = b->i_ctime;
262         a->i_flags = b->i_flags;
263         /* allocation of space */
264         a->i_blocks = b->i_blocks;
265 }
266
267 #endif /* __LINUX_CLASS_OBD_H */