2 * Copryright (C) 2001 Cluster File Systems, Inc.
8 #include <linux/config.h>
9 #include <linux/module.h>
10 #include <linux/kernel.h>
12 #include <linux/string.h>
13 #include <linux/stat.h>
14 #include <linux/errno.h>
15 #include <linux/locks.h>
16 #include <linux/unistd.h>
18 #include <asm/system.h>
19 #include <asm/uaccess.h>
22 #include <linux/stat.h>
23 #include <asm/uaccess.h>
24 #include <linux/vmalloc.h>
25 #include <asm/segment.h>
26 #include <linux/miscdevice.h>
28 #include <linux/obd_support.h>
29 #include <linux/obd_class.h>
30 #include <linux/lustre_lib.h>
31 #include <linux/lustre_idl.h>
33 extern int ost_queue_req(struct obd_device *, struct ptlrpc_request *);
35 struct ptlrpc_request *ost_prep_req(int opcode, int buflen1, char *buf1,
36 int buflen2, char *buf2)
38 struct ptlrpc_request *request;
42 request = (struct ptlrpc_request *)kmalloc(sizeof(*request), GFP_KERNEL);
44 printk("osc_prep_req: request allocation out of memory\n");
48 rc = ost_pack_req(buf1, buflen1, buf2, buflen2,
49 &request->rq_reqhdr, &request->rq_req.ost,
50 &request->rq_reqlen, &request->rq_reqbuf);
52 printk("llight request: cannot pack request %d\n", rc);
55 request->rq_reqhdr->opc = opcode;
61 extern int osc_queue_wait(struct obd_conn *conn, struct ptlrpc_request *req)
63 struct obd_device *client = conn->oc_dev;
64 struct obd_device *target = client->u.osc.osc_tgt;
68 /* set the connection id */
69 req->rq_req.ost->connid = conn->oc_id;
71 CDEBUG(D_INODE, "tgt at %p, conn id %d, opcode %d request at: %p\n",
72 &conn->oc_dev->u.osc.osc_tgt->u.ost,
73 conn->oc_id, req->rq_reqhdr->opc, req);
75 /* XXX fix the race here (wait_for_event?)*/
76 /* hand the packet over to the server */
77 rc = ost_queue_req(target, req);
79 printk("osc_queue_wait: error %d, opcode %d\n", rc,
84 /* wait for the reply */
85 init_waitqueue_head(&req->rq_wait_for_rep);
86 interruptible_sleep_on(&req->rq_wait_for_rep);
88 ost_unpack_rep(req->rq_repbuf, req->rq_replen, &req->rq_rephdr,
90 printk("-->osc_queue_wait: buf %p len %d status %d\n",
91 req->rq_repbuf, req->rq_replen, req->rq_rephdr->status);
94 return req->rq_rephdr->status;
97 void osc_free_req(struct ptlrpc_request *request)
99 if (request->rq_repbuf)
100 kfree(request->rq_repbuf);
105 int osc_connect(struct obd_conn *conn)
107 struct ptlrpc_request *request;
111 request = ost_prep_req(OST_CONNECT, 0, NULL, 0, NULL);
113 printk("osc_connect: cannot pack req!\n");
117 rc = osc_queue_wait(conn, request);
123 CDEBUG(D_INODE, "received connid %d\n", request->rq_rep.ost->connid);
125 conn->oc_id = request->rq_rep.ost->connid;
127 osc_free_req(request);
132 int osc_disconnect(struct obd_conn *conn)
134 struct ptlrpc_request *request;
138 request = ost_prep_req(OST_DISCONNECT, 0, NULL, 0, NULL);
140 printk("osc_connect: cannot pack req!\n");
144 rc = osc_queue_wait(conn, request);
150 osc_free_req(request);
156 int osc_getattr(struct obd_conn *conn, struct obdo *oa)
158 struct ptlrpc_request *request;
161 request = ost_prep_req(OST_GETATTR, 0, NULL, 0, NULL);
163 printk("osc_connect: cannot pack req!\n");
167 memcpy(&request->rq_req.ost->oa, oa, sizeof(*oa));
168 request->rq_req.ost->oa.o_valid = ~0;
170 rc = osc_queue_wait(conn, request);
176 CDEBUG(D_INODE, "mode: %o\n", request->rq_rep.ost->oa.o_mode);
178 memcpy(oa, &request->rq_rep.ost->oa, sizeof(*oa));
182 osc_free_req(request);
186 int osc_create(struct obd_conn *conn, struct obdo *oa)
188 struct ptlrpc_request *request;
192 printk(__FUNCTION__ ": oa NULL\n");
194 request = ost_prep_req(OST_CREATE, 0, NULL, 0, NULL);
196 printk("osc_connect: cannot pack req!\n");
200 memcpy(&request->rq_req.ost->oa, oa, sizeof(*oa));
201 request->rq_req.ost->oa.o_valid = ~0;
203 rc = osc_queue_wait(conn, request);
208 memcpy(oa, &request->rq_rep.ost->oa, sizeof(*oa));
211 osc_free_req(request);
216 /* mount the file system (secretly) */
217 static int osc_setup(struct obd_device *obddev, obd_count len,
221 struct obd_ioctl_data* data = buf;
222 struct osc_obd *osc = &obddev->u.osc;
225 if (data->ioc_dev < 0 || data->ioc_dev > MAX_OBD_DEVICES) {
230 osc->osc_tgt = &obd_dev[data->ioc_dev];
231 printk("OSC: tgt %d ost at %p\n", data->ioc_dev, &osc->osc_tgt->u.ost);
232 if ( ! (osc->osc_tgt->obd_flags & OBD_ATTACHED) ||
233 ! (osc->osc_tgt->obd_flags & OBD_SET_UP) ){
234 printk("device not attached or not set up (%d)\n",
245 void osc_sendpage(struct niobuf *dst, struct niobuf *src)
247 memcpy((char *)(unsigned long)dst->addr,
248 (char *)(unsigned long)src->addr,
254 int osc_brw(int rw, struct obd_conn *conn, obd_count num_oa,
255 struct obdo **oa, obd_count *oa_bufs, struct page **buf,
256 obd_size *count, obd_off *offset, obd_flag *flags)
258 struct ptlrpc_request *request;
260 struct obd_ioobj ioo;
262 int size1, size2 = 0;
266 size1 = num_oa * sizeof(ioo);
267 for (i = 0; i < num_oa; i++) {
268 size2 += oa_bufs[i] * sizeof(src);
271 request = ost_prep_req(OST_PREPW, size1, NULL, size2, NULL);
273 printk("osc_connect: cannot pack req!\n");
278 ptr1 = ost_req_buf1(request->rq_req.ost);
279 ptr2 = ost_req_buf2(request->rq_req.ost);
280 for (i=0; i < num_oa; i++) {
281 ost_pack_ioo(&ptr1, oa[i], oa_bufs[i]);
282 for (j = 0 ; j < oa_bufs[i] ; j++) {
283 ost_pack_niobuf(&ptr2, kmap(buf[n]), offset[n],
289 rc = osc_queue_wait(conn, request);
295 ptr2 = ost_rep_buf2(request->rq_rep.ost);
296 if (request->rq_rep.ost->buflen2 != n * sizeof(struct niobuf)) {
297 printk(__FUNCTION__ ": buffer length wrong\n");
301 for (i=0; i < num_oa; i++) {
302 for (j = 0 ; j < oa_bufs[i] ; j++) {
304 src.addr = (__u64)(unsigned long)buf[n];
306 ost_unpack_niobuf(&ptr2, &dst);
307 osc_sendpage(dst, &src);
311 //ost_complete_brw(rep);
314 if (request->rq_rephdr)
315 kfree(request->rq_rephdr);
317 for (i=0; i < num_oa; i++) {
318 for (j = 0 ; j < oa_bufs[i] ; j++) {
324 osc_free_req(request);
332 static int osc_cleanup(struct obd_device * obddev)
336 if ( !(obddev->obd_flags & OBD_SET_UP) ) {
347 struct obd_ops osc_obd_ops = {
349 o_cleanup: osc_cleanup,
350 o_create: osc_create,
351 o_getattr: osc_getattr,
352 o_connect: osc_connect,
353 o_disconnect: osc_disconnect
356 static int __init osc_init(void)
358 obd_register_type(&osc_obd_ops, LUSTRE_OSC_NAME);
362 static void __exit osc_exit(void)
364 obd_unregister_type(LUSTRE_OSC_NAME);
367 MODULE_AUTHOR("Peter J. Braam <braam@clusterfs.com>");
368 MODULE_DESCRIPTION("Lustre Object Storage Client (OSC) v1.0");
369 MODULE_LICENSE("GPL");
371 module_init(osc_init);
372 module_exit(osc_exit);