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