1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (c) 2002 Cluster File Systems, Inc. <info@clusterfs.com>
6 * This file is part of Lustre, http://www.lustre.org.
8 * Lustre is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * Lustre is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Lustre; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #define DEBUG_SUBSYSTEM S_COBD
24 #include <linux/version.h>
25 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
26 #include <linux/init.h>
28 #include <linux/obd_support.h>
29 #include <linux/lustre_lib.h>
30 #include <linux/lustre_net.h>
31 #include <linux/lustre_idl.h>
32 #include <linux/obd_class.h>
33 #include <linux/obd_cache.h>
35 static int cobd_attach(struct obd_device *dev, obd_count len, void *data)
37 struct lprocfs_static_vars lvars;
39 lprocfs_init_vars(&lvars);
40 return lprocfs_obd_attach(dev, lvars.obd_vars);
43 static int cobd_detach(struct obd_device *dev)
45 return lprocfs_obd_detach(dev);
49 cobd_setup (struct obd_device *dev, obd_count len, void *buf)
51 struct obd_ioctl_data *data = (struct obd_ioctl_data *)buf;
52 struct cache_obd *cobd = &dev->u.cobd;
53 struct obd_device *target;
54 struct obd_device *cache;
55 struct obd_uuid target_uuid;
56 struct obd_uuid cache_uuid;
59 if (data->ioc_inlbuf1 == NULL ||
60 data->ioc_inlbuf2 == NULL)
63 obd_str2uuid(&target_uuid, data->ioc_inlbuf1);
64 target = class_uuid2obd (&target_uuid);
66 obd_str2uuid(&cache_uuid, data->ioc_inlbuf2);
67 cache = class_uuid2obd (&cache_uuid);
72 /* don't bother checking attached/setup;
73 * obd_connect() should, and it can change underneath us */
74 rc = obd_connect (&cobd->cobd_target, target, &target_uuid);
78 rc = obd_connect (&cobd->cobd_cache, cache, &cache_uuid);
85 obd_disconnect (&cobd->cobd_target, 0 );
90 cobd_cleanup (struct obd_device *dev, int force, int failover)
92 struct cache_obd *cobd = &dev->u.cobd;
95 if (!list_empty (&dev->obd_exports))
98 rc = obd_disconnect (&cobd->cobd_cache, failover);
100 CERROR ("error %d disconnecting cache\n", rc);
102 rc = obd_disconnect (&cobd->cobd_target, failover);
104 CERROR ("error %d disconnecting target\n", rc);
110 cobd_connect (struct lustre_handle *conn, struct obd_device *obd,
111 struct obd_uuid *cluuid)
113 int rc = class_connect (conn, obd, cluuid);
115 CERROR ("rc %d\n", rc);
120 cobd_disconnect (struct lustre_handle *conn, int failover)
122 int rc = class_disconnect (conn, failover);
124 CERROR ("rc %d\n", rc);
129 cobd_get_info(struct lustre_handle *conn, obd_count keylen,
130 void *key, __u32 *vallen, void *val)
132 struct obd_device *obd = class_conn2obd(conn);
133 struct cache_obd *cobd;
136 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
142 /* intercept cache utilisation info? */
144 return obd_get_info(&cobd->cobd_target, keylen, key, vallen, val);
147 static int cobd_statfs(struct obd_export *exp, struct obd_statfs *osfs)
149 struct obd_export *cobd_exp;
152 if (exp->exp_obd == NULL)
155 cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
156 rc = obd_statfs(cobd_exp, osfs);
157 class_export_put(cobd_exp);
162 cobd_getattr(struct lustre_handle *conn, struct obdo *oa,
163 struct lov_stripe_md *lsm)
165 struct obd_device *obd = class_conn2obd(conn);
166 struct cache_obd *cobd;
169 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
174 return (obd_getattr (&cobd->cobd_target, oa, lsm));
178 cobd_open(struct lustre_handle *conn, struct obdo *oa,
179 struct lov_stripe_md *lsm, struct obd_trans_info *oti,
180 struct obd_client_handle *och)
182 struct obd_device *obd = class_conn2obd(conn);
183 struct cache_obd *cobd;
186 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
191 return (obd_open (&cobd->cobd_target, oa, lsm, oti, och));
195 cobd_close(struct lustre_handle *conn, struct obdo *oa,
196 struct lov_stripe_md *lsm, struct obd_trans_info *oti)
198 struct obd_device *obd = class_conn2obd(conn);
199 struct cache_obd *cobd;
202 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
207 return (obd_close (&cobd->cobd_target, oa, lsm, oti));
210 static int cobd_preprw(int cmd, struct obd_export *exp, struct obdo *obdo,
211 int objcount, struct obd_ioobj *obj,
212 int niocount, struct niobuf_remote *nb,
213 struct niobuf_local *res, void **desc_private,
214 struct obd_trans_info *oti)
216 struct obd_export *cobd_exp;
219 if (exp->exp_obd == NULL)
222 if ((cmd & OBD_BRW_WRITE) != 0)
225 cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
226 rc = obd_preprw(cmd, cobd_exp, obdo, objcount, obj, niocount, nb, res,
228 class_export_put(cobd_exp);
232 static int cobd_commitrw(int cmd, struct obd_export *exp,
233 int objcount, struct obd_ioobj *obj,
234 int niocount, struct niobuf_local *local,
235 void *desc_private, struct obd_trans_info *oti)
237 struct obd_export *cobd_exp;
240 if (exp->exp_obd == NULL)
243 if ((cmd & OBD_BRW_WRITE) != 0)
246 cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
247 rc = obd_commitrw(cmd, cobd_exp, objcount, obj, niocount, local,
249 class_export_put(cobd_exp);
254 cobd_brw(int cmd, struct lustre_handle *conn,
255 struct lov_stripe_md *lsm, obd_count oa_bufs,
256 struct brw_page *pga, struct obd_trans_info *oti)
258 struct obd_device *obd = class_conn2obd(conn);
259 struct cache_obd *cobd;
262 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
266 if ((cmd & OBD_BRW_WRITE) != 0)
270 return (obd_brw (cmd, &cobd->cobd_target,
271 lsm, oa_bufs, pga, oti));
275 cobd_iocontrol(unsigned int cmd, struct lustre_handle *conn, int len,
276 void *karg, void *uarg)
278 struct obd_device *obd = class_conn2obd(conn);
279 struct cache_obd *cobd;
282 CERROR("invalid client cookie "LPX64"\n", conn->cookie);
289 return (obd_iocontrol (cmd, &cobd->cobd_target, len, karg, uarg));
292 static struct obd_ops cobd_ops = {
293 o_owner: THIS_MODULE,
294 o_attach: cobd_attach,
295 o_detach: cobd_detach,
298 o_cleanup: cobd_cleanup,
300 o_connect: cobd_connect,
301 o_disconnect: cobd_disconnect,
303 o_get_info: cobd_get_info,
304 o_statfs: cobd_statfs,
306 o_getattr: cobd_getattr,
309 o_preprw: cobd_preprw,
310 o_commitrw: cobd_commitrw,
312 o_iocontrol: cobd_iocontrol,
315 static int __init cobd_init(void)
317 struct lprocfs_static_vars lvars;
320 printk(KERN_INFO "Lustre Caching OBD driver; info@clusterfs.com\n");
322 lprocfs_init_vars(&lvars);
323 RETURN(class_register_type(&cobd_ops, lvars.module_vars,
324 OBD_CACHE_DEVICENAME));
327 static void __exit cobd_exit(void)
329 class_unregister_type(OBD_CACHE_DEVICENAME);
332 MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
333 MODULE_DESCRIPTION("Lustre Caching OBD driver");
334 MODULE_LICENSE("GPL");
336 module_init(cobd_init);
337 module_exit(cobd_exit);