#define DEBUG_SUBSYSTEM S_COBD
#include <linux/version.h>
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
#include <linux/init.h>
-#endif
#include <linux/obd_support.h>
#include <linux/lustre_lib.h>
#include <linux/lustre_net.h>
{
struct lprocfs_static_vars lvars;
- lprocfs_init_vars(&lvars);
- return lprocfs_obd_attach(dev, lvars.obd_vars);
+ lprocfs_init_vars(cobd, &lvars);
+ return lprocfs_obd_attach(dev, lvars.obd_vars);
}
static int cobd_detach(struct obd_device *dev)
{
- return lprocfs_obd_detach(dev);
+ return lprocfs_obd_detach(dev);
}
static int
cobd_setup (struct obd_device *dev, obd_count len, void *buf)
{
- struct obd_ioctl_data *data = (struct obd_ioctl_data *)buf;
+ struct lustre_cfg *lcfg = (struct lustre_cfg *)buf;
struct cache_obd *cobd = &dev->u.cobd;
struct obd_device *target;
struct obd_device *cache;
struct obd_uuid target_uuid;
struct obd_uuid cache_uuid;
+ struct lustre_handle target_conn = {0,}, cache_conn = {0,};
int rc;
- if (data->ioc_inlbuf1 == NULL ||
- data->ioc_inlbuf2 == NULL)
+ if (lcfg->lcfg_inlbuf1 == NULL ||
+ lcfg->lcfg_inlbuf2 == NULL)
return (-EINVAL);
- obd_str2uuid(&target_uuid, data->ioc_inlbuf1);
+ obd_str2uuid(&target_uuid, lcfg->lcfg_inlbuf1);
target = class_uuid2obd (&target_uuid);
- obd_str2uuid(&cache_uuid, data->ioc_inlbuf2);
+ obd_str2uuid(&cache_uuid, lcfg->lcfg_inlbuf2);
cache = class_uuid2obd (&cache_uuid);
if (target == NULL ||
cache == NULL)
/* don't bother checking attached/setup;
* obd_connect() should, and it can change underneath us */
- rc = obd_connect (&cobd->cobd_target, target, &target_uuid);
+ rc = obd_connect(&target_conn, target, &target_uuid);
if (rc != 0)
return (rc);
+ cobd->cobd_target_exp = class_conn2export(&target_conn);
- rc = obd_connect (&cobd->cobd_cache, cache, &cache_uuid);
- if (rc != 0)
- goto fail_0;
-
- return (0);
+ rc = obd_connect(&cache_conn, cache, &cache_uuid);
+ if (rc != 0) {
+ obd_disconnect(cobd->cobd_target_exp, 0);
+ return rc;
+ }
+ cobd->cobd_cache_exp = class_conn2export(&cache_conn);
- fail_0:
- obd_disconnect (&cobd->cobd_target, 0 );
- return (rc);
+ return rc;
}
-static int
-cobd_cleanup (struct obd_device *dev, int force, int failover)
+static int cobd_cleanup(struct obd_device *dev, int flags)
{
struct cache_obd *cobd = &dev->u.cobd;
int rc;
- if (!list_empty (&dev->obd_exports))
+ if (!list_empty(&dev->obd_exports))
return (-EBUSY);
- rc = obd_disconnect (&cobd->cobd_cache, failover);
+ rc = obd_disconnect(cobd->cobd_cache_exp, flags);
if (rc != 0)
CERROR ("error %d disconnecting cache\n", rc);
- rc = obd_disconnect (&cobd->cobd_target, failover);
+ rc = obd_disconnect(cobd->cobd_target_exp, flags);
if (rc != 0)
CERROR ("error %d disconnecting target\n", rc);
return (rc);
}
-static int
-cobd_disconnect (struct lustre_handle *conn, int failover)
+static int cobd_disconnect(struct obd_export *exp, int flags)
{
- int rc = class_disconnect (conn, failover);
+ int rc = class_disconnect(exp, flags);
CERROR ("rc %d\n", rc);
- return (rc);
+ return (rc);
}
-static int
-cobd_get_info(struct lustre_handle *conn, obd_count keylen,
- void *key, __u32 *vallen, void *val)
+static int cobd_get_info(struct obd_export *exp, obd_count keylen,
+ void *key, __u32 *vallen, void *val)
{
- struct obd_device *obd = class_conn2obd(conn);
+ struct obd_device *obd = class_exp2obd(exp);
struct cache_obd *cobd;
if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
return -EINVAL;
}
/* intercept cache utilisation info? */
- return obd_get_info(&cobd->cobd_target, keylen, key, vallen, val);
-}
-
-static int cobd_statfs(struct obd_export *exp, struct obd_statfs *osfs)
-{
- struct obd_export *cobd_exp;
- int rc;
-
- if (exp->exp_obd == NULL)
- return -EINVAL;
-
- cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
- rc = obd_statfs(cobd_exp, osfs);
- class_export_put(cobd_exp);
- return rc;
-}
-
-static int
-cobd_getattr(struct lustre_handle *conn, struct obdo *oa,
- struct lov_stripe_md *lsm)
-{
- struct obd_device *obd = class_conn2obd(conn);
- struct cache_obd *cobd;
-
- if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
- return -EINVAL;
- }
-
- cobd = &obd->u.cobd;
- return (obd_getattr (&cobd->cobd_target, oa, lsm));
+ return obd_get_info(cobd->cobd_target_exp, keylen, key, vallen, val);
}
-static int
-cobd_open(struct lustre_handle *conn, struct obdo *oa,
- struct lov_stripe_md *lsm, struct obd_trans_info *oti,
- struct obd_client_handle *och)
+static int cobd_statfs(struct obd_device *obd, struct obd_statfs *osfs,
+ unsigned long max_age)
{
- struct obd_device *obd = class_conn2obd(conn);
- struct cache_obd *cobd;
-
- if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
- return -EINVAL;
- }
-
- cobd = &obd->u.cobd;
- return (obd_open (&cobd->cobd_target, oa, lsm, oti, och));
+ return obd_statfs(class_exp2obd(obd->u.cobd.cobd_target_exp), osfs,
+ max_age);
}
-static int
-cobd_close(struct lustre_handle *conn, struct obdo *oa,
- struct lov_stripe_md *lsm, struct obd_trans_info *oti)
+static int cobd_getattr(struct obd_export *exp, struct obdo *oa,
+ struct lov_stripe_md *lsm)
{
- struct obd_device *obd = class_conn2obd(conn);
+ struct obd_device *obd = class_exp2obd(exp);
struct cache_obd *cobd;
if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
return -EINVAL;
}
cobd = &obd->u.cobd;
- return (obd_close (&cobd->cobd_target, oa, lsm, oti));
+ return obd_getattr(cobd->cobd_target_exp, oa, lsm);
}
-static int cobd_preprw(int cmd, struct obd_export *exp, struct obdo *obdo,
+static int cobd_preprw(int cmd, struct obd_export *exp, struct obdo *oa,
int objcount, struct obd_ioobj *obj,
int niocount, struct niobuf_remote *nb,
- struct niobuf_local *res, void **desc_private,
- struct obd_trans_info *oti)
+ struct niobuf_local *res, struct obd_trans_info *oti)
{
struct obd_export *cobd_exp;
int rc;
if ((cmd & OBD_BRW_WRITE) != 0)
return -EOPNOTSUPP;
- cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
- rc = obd_preprw(cmd, cobd_exp, obdo, objcount, obj, niocount, nb, res,
- desc_private, oti);
- class_export_put(cobd_exp);
+ cobd_exp = exp->exp_obd->u.cobd.cobd_target_exp;
+ rc = obd_preprw(cmd, cobd_exp, oa, objcount, obj, niocount, nb, res,
+ oti);
+
return rc;
}
-static int cobd_commitrw(int cmd, struct obd_export *exp,
+static int cobd_commitrw(int cmd, struct obd_export *exp, struct obdo *oa,
int objcount, struct obd_ioobj *obj,
int niocount, struct niobuf_local *local,
- void *desc_private, struct obd_trans_info *oti)
+ struct obd_trans_info *oti)
{
struct obd_export *cobd_exp;
int rc;
if ((cmd & OBD_BRW_WRITE) != 0)
return -EOPNOTSUPP;
- cobd_exp = class_conn2export(&exp->exp_obd->u.cobd.cobd_target);
- rc = obd_commitrw(cmd, cobd_exp, objcount, obj, niocount, local,
- desc_private, oti);
- class_export_put(cobd_exp);
+ cobd_exp = exp->exp_obd->u.cobd.cobd_target_exp;
+ rc = obd_commitrw(cmd, cobd_exp, oa, objcount, obj,niocount,local,oti);
return rc;
}
-static inline int
-cobd_brw(int cmd, struct lustre_handle *conn,
- struct lov_stripe_md *lsm, obd_count oa_bufs,
- struct brw_page *pga, struct obd_trans_info *oti)
+static int cobd_brw(int cmd, struct obd_export *exp, struct obdo *oa,
+ struct lov_stripe_md *lsm, obd_count oa_bufs,
+ struct brw_page *pga, struct obd_trans_info *oti)
{
- struct obd_device *obd = class_conn2obd(conn);
+ struct obd_device *obd = class_exp2obd(exp);
struct cache_obd *cobd;
if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
return -EINVAL;
}
return -EOPNOTSUPP;
cobd = &obd->u.cobd;
- return (obd_brw (cmd, &cobd->cobd_target,
- lsm, oa_bufs, pga, oti));
+ return obd_brw(cmd, cobd->cobd_target_exp, oa, lsm, oa_bufs, pga, oti);
}
-static int
-cobd_iocontrol(unsigned int cmd, struct lustre_handle *conn, int len,
- void *karg, void *uarg)
+static int cobd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
+ void *karg, void *uarg)
{
- struct obd_device *obd = class_conn2obd(conn);
+ struct obd_device *obd = class_exp2obd(exp);
struct cache_obd *cobd;
if (obd == NULL) {
- CERROR("invalid client cookie "LPX64"\n", conn->cookie);
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
return -EINVAL;
}
/* intercept? */
cobd = &obd->u.cobd;
- return (obd_iocontrol (cmd, &cobd->cobd_target, len, karg, uarg));
+ return obd_iocontrol(cmd, cobd->cobd_target_exp, len, karg, uarg);
}
static struct obd_ops cobd_ops = {
o_statfs: cobd_statfs,
o_getattr: cobd_getattr,
- o_open: cobd_open,
- o_close: cobd_close,
o_preprw: cobd_preprw,
o_commitrw: cobd_commitrw,
o_brw: cobd_brw,
struct lprocfs_static_vars lvars;
ENTRY;
- printk(KERN_INFO "Lustre Caching OBD driver; info@clusterfs.com\n");
+ printk(KERN_INFO "Lustre: Caching OBD driver; info@clusterfs.com\n");
- lprocfs_init_vars(&lvars);
+ lprocfs_init_vars(cobd, &lvars);
RETURN(class_register_type(&cobd_ops, lvars.module_vars,
OBD_CACHE_DEVICENAME));
}
-static void __exit cobd_exit(void)
+static void /*__exit*/ cobd_exit(void)
{
- class_unregister_type(OBD_CACHE_DEVICENAME);
+ class_unregister_type(OBD_CACHE_DEVICENAME);
}
MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");