int mds_reint(int offset, struct ptlrpc_request *req);
/* mdc/mdc_request.c */
-static inline struct mdc_obd *mdc_conn2mdc(struct lustre_handle *conn)
-{
- return &class_conn2obd(conn)->u.mdc;
-}
+extern int mdc_con2cl(struct lustre_handle *conn, struct ptlrpc_client **cl,
+ struct ptlrpc_connection **connection,
+ struct lustre_handle **rconn);
int mdc_enqueue(struct lustre_handle *conn, int lock_type,
struct lookup_intent *it, int lock_mode, struct inode *dir,
struct mds_server_data;
struct mdc_obd {
- struct lustre_handle mdc_connh;
struct ptlrpc_client *mdc_client;
struct ptlrpc_client *mdc_ldlm_client;
struct ptlrpc_connection *mdc_conn;
};
struct osc_obd {
- struct lustre_handle osc_connh;
struct ptlrpc_client *osc_client;
struct ptlrpc_client *osc_ldlm_client;
struct ptlrpc_connection *osc_conn;
};
struct lov_obd {
+ struct lustre_handle mdc_connh;
struct obd_device *mdcobd;
struct lov_desc desc;
int bufsize;
#ifdef __KERNEL__
extern struct obd_export *class_conn2export(struct lustre_handle *conn);
extern struct obd_device *class_conn2obd(struct lustre_handle *conn);
+extern int class_import2export(struct lustre_handle *conn,
+ struct lustre_handle *imp);
struct obd_export {
__u64 export_cookie;
struct obd_import {
__u64 import_cookie;
- struct lustre_handle import_export; /* client handle */
+ struct lustre_handle import_export; /* server handle */
struct list_head import_chain;
struct obd_device *import_obd;
unsigned int import_id;
memcpy(&lli->lli_intent_lock_handle, &lockh, sizeof(lockh));
ino = ll_inode_by_name(dir, dentry, &type);
+#warning FIXME: handle negative inode case (see old ll_lookup)
err = mdc_getattr(&sbi->ll_mdc_conn, ino, type,
OBD_MD_FLNOTOBD|OBD_MD_FLBLOCKS, 0, &request);
CERROR("OST %s: not setup or attached\n", ost);
GOTO(out_free, sb = NULL);
}
+#warning error: need to set obd->u.lov.mdc_connh from sbi->ll_mdc_conn
err = obd_connect(&sbi->ll_osc_conn, obd);
if (err) {
CERROR("cannot connect to %s: rc = %d\n", ost, err);
err = ll_commitcbd_setup(sbi);
if (err) {
CERROR("failed to start commit callback daemon: rc = %d\n",err);
- GOTO(out_mdc, sb = NULL);
+ GOTO(out_request, sb = NULL);
}
md.body = lustre_msg_buf(request->rq_repmsg, 0);
out_cdb:
ll_commitcbd_cleanup(sbi);
-out_mdc:
- obd_disconnect(&sbi->ll_mdc_conn);
- obd_disconnect(&sbi->ll_osc_conn);
-out_disc:
+out_request:
ptlrpc_free_req(request);
obd_disconnect(&sbi->ll_osc_conn);
+out_mdc:
+ obd_disconnect(&sbi->ll_mdc_conn);
out_free:
OBD_FREE(sbi, sizeof(*sbi));
/* obd methods */
-static int lov_getinfo(struct obd_device *obd,
- struct lov_desc *desc,
- uuid_t **uuids,
- struct ptlrpc_request **request)
+static int lov_getinfo(struct obd_device *obd, struct lov_desc *desc,
+ uuid_t **uuids, struct ptlrpc_request **request)
{
struct ptlrpc_request *req;
struct mds_status_req *streq;
- struct lov_obd *lov = &obd->u.lov;
+ struct lov_obd *lov = &obd->u.lov;
struct mdc_obd *mdc = &lov->mdcobd->u.mdc;
int rc, size[2] = {sizeof(*streq)};
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+#warning error: need to set lov->mdc_connh somewhere!!!!
+ req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &lov->mdc_connh,
MDS_LOVINFO, 1, size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
-
+
*request = req;
streq = lustre_msg_buf(req->rq_reqmsg, 0);
streq->flags = HTON__u32(MDS_STATUS_LOV);
streq->repbuf = HTON__u32(8000);
-
- /* prepare for reply */
+
+ /* prepare for reply */
req->rq_level = LUSTRE_CONN_CON;
- size[0] = sizeof(*desc);
- size[1] = 8000;
+ size[0] = sizeof(*desc);
+ size[1] = 8000;
req->rq_replen = lustre_msg_size(2, size);
-
+
rc = ptlrpc_queue_wait(req);
rc = ptlrpc_check_status(req, rc);
if (!rc) {
memcpy(desc, lustre_msg_buf(req->rq_repmsg, 0), sizeof(*desc));
*uuids = lustre_msg_buf(req->rq_repmsg, 1);
- lov_unpackdesc(desc);
+ lov_unpackdesc(desc);
}
- mdc->mdc_max_mdsize = sizeof(*desc) +
+ mdc->mdc_max_mdsize = sizeof(*desc) +
desc->ld_tgt_count * sizeof(uuid_t);
EXIT;
struct inode *inode, struct iattr *iattr,
struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct mds_rec_setattr *rec;
struct ptlrpc_request *req;
int rc, size = sizeof(*rec);
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_REINT, 1, &size, NULL);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_REINT, 1, &size, NULL);
if (!req)
RETURN(-ENOMEM);
int mdc_create(struct lustre_handle *conn,
struct inode *dir, const char *name, int namelen,
const char *tgt, int tgtlen, int mode, __u32 uid,
- __u32 gid, __u64 time, __u64 rdev, struct lov_stripe_md *md,
+ __u32 gid, __u64 time, __u64 rdev, struct lov_stripe_md *smd,
struct ptlrpc_request **request)
{
struct mds_rec_create *rec;
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req;
int rc, size[3] = {sizeof(struct mds_rec_create), namelen + 1, 0};
char *tmp, *bufs[3] = {NULL, NULL, NULL};
ENTRY;
if (S_ISREG(mode)) {
- if (!md) {
+ if (!smd) {
CERROR("File create, but no md (%ld, %*s)\n",
dir->i_ino, namelen, name);
LBUG();
}
- size[2] = md->lmd_size;
- bufs[2] = (char *)md;
+ size[2] = smd->lmd_size;
+ bufs[2] = (char *)smd;
bufcount = 3;
} else if (S_ISLNK(mode)) {
size[2] = tgtlen + 1;
bufcount = 3;
}
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_REINT,
- bufcount, size, bufs);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_REINT, bufcount, size, bufs);
if (!req)
RETURN(-ENOMEM);
if (S_ISREG(mode)) {
tmp = lustre_msg_buf(req->rq_reqmsg, 2);
- memcpy(tmp, md, md->lmd_size);
+ memcpy(tmp, smd, smd->lmd_size);
} else if (S_ISLNK(mode)) {
tmp = lustre_msg_buf(req->rq_reqmsg, 2);
LOGL0(tgt, tgtlen, tmp);
struct inode *dir, struct inode *child, const char *name,
int namelen, struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req;
int rc, size[2] = {sizeof(struct mds_rec_unlink), namelen + 1};
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_REINT, 2, size, NULL);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_REINT, 2, size, NULL);
if (!req)
RETURN(-ENOMEM);
struct dentry *src, struct inode *dir, const char *name,
int namelen, struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req;
int rc, size[2] = {sizeof(struct mds_rec_link), namelen + 1};
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_REINT, 2, size, NULL);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_REINT, 2, size, NULL);
if (!req)
RETURN(-ENOMEM);
int oldlen, const char *new, int newlen,
struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req;
int rc, size[3] = {sizeof(struct mds_rec_rename), oldlen + 1,
newlen + 1};
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_REINT, 3, size, NULL);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_REINT, 3, size, NULL);
if (!req)
RETURN(-ENOMEM);
extern int mds_queue_req(struct ptlrpc_request *);
+int mdc_con2cl(struct lustre_handle *conn, struct ptlrpc_client **cl,
+ struct ptlrpc_connection **connection,
+ struct lustre_handle **rconn)
+{
+ struct obd_export *export;
+ struct mdc_obd *mdc;
+
+ export = class_conn2export(conn);
+ if (!export)
+ return -EINVAL;
+
+ mdc = &export->export_obd->u.mdc;
+
+ *cl = mdc->mdc_client;
+ *connection = mdc->mdc_conn;
+ *rconn = &export->export_import;
+
+ return 0;
+}
+
+static int mdc_con2dlmcl(struct lustre_handle *conn, struct ptlrpc_client **cl,
+ struct ptlrpc_connection **connection,
+ struct lustre_handle **rconn)
+{
+ struct obd_export *export;
+ struct mdc_obd *mdc;
+
+ export = class_conn2export(conn);
+ if (!export)
+ return -EINVAL;
+
+ mdc = &export->export_obd->u.mdc;
+
+ *cl = mdc->mdc_ldlm_client;
+ *connection = mdc->mdc_conn;
+ *rconn = &export->export_import;
+
+ return 0;
+}
+
int mdc_getstatus(struct lustre_handle *conn, struct ll_fid *rootfid,
__u64 *last_committed, __u64 *last_rcvd,
{
struct ptlrpc_request *req;
struct mds_body *body;
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
int rc, size = sizeof(*body);
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_GETSTATUS, 1, &size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
obd_id ino, int type, unsigned long valid, size_t ea_size,
struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req;
struct mds_body *body;
int rc, size[2] = {sizeof(*body), 0}, bufcount = 1;
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_GETATTR, 1, size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
body->valid = valid;
if (S_ISREG(type)) {
+ struct mdc_obd *mdc = &class_conn2obd(conn)->u.mdc;
bufcount = 2;
size[1] = mdc->mdc_max_mdsize;
} else if (valid & OBD_MD_LINKNAME) {
{
struct ptlrpc_request *req;
struct obd_device *obddev = class_conn2obd(conn);
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
__u64 res_id[RES_NAME_SIZE] = {dir->i_ino};
int size[5] = {sizeof(struct ldlm_request), sizeof(struct ldlm_intent)};
int rc, flags;
int repsize[3] = {sizeof(struct ldlm_reply),
sizeof(struct mds_body),
- mdc->mdc_max_mdsize};
+ obddev->u.mdc.mdc_max_mdsize};
struct ldlm_reply *dlm_rep;
struct ldlm_intent *lit;
ENTRY;
break;
}
+ mdc_con2dlmcl(conn, &cl, &connection, &rconn);
if (it->it_op & (IT_MKDIR | IT_CREAT | IT_SYMLINK | IT_MKNOD)) {
size[2] = sizeof(struct mds_rec_create);
size[3] = de->d_name.len + 1;
size[4] = tgtlen + 1;
- req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 5, size,
- NULL);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ LDLM_ENQUEUE, 5, size, NULL);
if (!req)
RETURN(-ENOMEM);
size[2] = sizeof(struct mds_rec_rename);
size[3] = old_de->d_name.len + 1;
size[4] = de->d_name.len + 1;
- req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 5, size,
- NULL);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ LDLM_ENQUEUE, 5, size, NULL);
if (!req)
RETURN(-ENOMEM);
} else if (it->it_op == IT_UNLINK || it->it_op == IT_RMDIR) {
size[2] = sizeof(struct mds_rec_unlink);
size[3] = de->d_name.len + 1;
- req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 4, size, NULL);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ LDLM_ENQUEUE, 4, size, NULL);
if (!req)
RETURN(-ENOMEM);
size[2] = sizeof(struct mds_body);
size[3] = de->d_name.len + 1;
- req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 4, size,
- NULL);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ LDLM_ENQUEUE, 4, size, NULL);
if (!req)
RETURN(-ENOMEM);
mds_getattr_pack(req, 2, dir, de->d_name.name, de->d_name.len);
/* get ready for the reply */
- req->rq_replen = lustre_msg_size(3, repsize);
+ req->rq_replen = lustre_msg_size(3, repsize);
} else if (it->it_op == IT_READDIR) {
- req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 1, size, NULL);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
+ LDLM_ENQUEUE, 1, size, NULL);
if (!req)
RETURN(-ENOMEM);
RETURN(-1);
}
#warning FIXME: the data here needs to be different if a lock was granted for a different inode
- rc = ldlm_cli_enqueue(mdc->mdc_ldlm_client, mdc->mdc_conn, NULL, req,
+ rc = ldlm_cli_enqueue(cl, connection, NULL, req,
obddev->obd_namespace, NULL, res_id, lock_type,
NULL, 0, lock_mode, &flags,
(void *)mdc_lock_callback, data, datalen, lockh);
}
int mdc_open(struct lustre_handle *conn, obd_id ino, int type, int flags,
- struct lov_stripe_md *md,
- __u64 cookie, __u64 *fh, struct ptlrpc_request **request)
+ struct lov_stripe_md *smd, __u64 cookie, __u64 *fh,
+ struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct mds_body *body;
int rc, size[2] = {sizeof(*body)}, bufcount = 1;
struct ptlrpc_request *req;
ENTRY;
- if (md != NULL) {
+ if (smd != NULL) {
bufcount = 2;
- size[1] = md->lmd_size;
+ size[1] = smd->lmd_size;
}
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_OPEN, bufcount, size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
body->flags = HTON__u32(flags);
body->extra = cookie;
- if (md != NULL)
- memcpy(lustre_msg_buf(req->rq_reqmsg, 1), md, md->lmd_size);
+ if (smd != NULL)
+ memcpy(lustre_msg_buf(req->rq_reqmsg, 1), smd, smd->lmd_size);
req->rq_replen = lustre_msg_size(1, size);
int mdc_close(struct lustre_handle *conn,
obd_id ino, int type, __u64 fh, struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct mds_body *body;
int rc, size = sizeof(*body);
struct ptlrpc_request *req;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_CLOSE, 1, &size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
int mdc_readpage(struct lustre_handle *conn, obd_id ino, int type, __u64 offset,
char *addr, struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *req = NULL;
struct ptlrpc_bulk_desc *desc = NULL;
struct ptlrpc_bulk_page *bulk = NULL;
CDEBUG(D_INODE, "inode: %ld\n", (long)ino);
- desc = ptlrpc_prep_bulk(mdc->mdc_conn);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ desc = ptlrpc_prep_bulk(connection);
if (desc == NULL)
GOTO(out, rc = -ENOMEM);
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_READPAGE, 1, &size, NULL);
if (!req)
GOTO(out2, rc = -ENOMEM);
int mdc_statfs(struct lustre_handle *conn, struct statfs *sfs,
struct ptlrpc_request **request)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct obd_statfs *osfs;
struct ptlrpc_request *req;
int rc, size = sizeof(*osfs);
ENTRY;
- req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ req = ptlrpc_prep_req2(cl, connection, rconn,
MDS_STATFS, 0, NULL, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
#if 0
/* FIXME XXX : This should use the new ioc_data to pass args in */
int err = 0;
- struct ptlrpc_client cl;
- struct ptlrpc_connection *conn;
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *request;
ENTRY;
ptlrpc_init_client(NULL, NULL,
MDS_REQUEST_PORTAL, MDC_REPLY_PORTAL, &cl);
- connection = ptlrpc_uuid_to_connection("mds");
- if (!connection) {
- CERROR("cannot create client\n");
- RETURN(-EINVAL);
- }
+ mdc_con2cl(conn, &cl, &connection, &rconn);
switch (cmd) {
case IOC_REQUEST_GETATTR: {
CERROR("-- getting attr for ino %lu\n", arg);
mdc->mdc_ldlm_client);
mdc->mdc_client->cli_name = "mdc";
mdc->mdc_ldlm_client->cli_name = "ldlm";
- mdc->mdc_max_mdsize = sizeof(struct lov_stripe_md);
+ mdc->mdc_max_mdsize = sizeof(struct lov_stripe_md);
/* XXX get recovery hooked in here again */
//ptlrpc_init_client(ptlrpc_connmgr, ll_recover,...
request->rq_level = LUSTRE_CONN_NEW;
request->rq_replen = lustre_msg_size(0, NULL);
+ /* Sending our local connection info breaks for local connections
+ request->rq_reqmsg->addr = conn->addr;
+ request->rq_reqmsg->cookie = conn->cookie;
+ */
rc = ptlrpc_queue_wait(request);
rc = ptlrpc_check_status(request, rc);
if (rc)
GOTO(out, rc);
- mdc->mdc_connh.addr = request->rq_repmsg->addr;
- mdc->mdc_connh.cookie = request->rq_repmsg->cookie;
+ class_import2export(conn, (struct lustre_handle *)request->rq_repmsg);
EXIT;
out:
static int mdc_disconnect(struct lustre_handle *conn)
{
- struct mdc_obd *mdc = mdc_conn2mdc(conn);
+ struct ptlrpc_client *cl;
+ struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct obd_device *obd = class_conn2obd(conn);
struct ptlrpc_request *request;
int rc;
ENTRY;
ldlm_namespace_free(obd->obd_namespace);
- request = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn,
- &mdc->mdc_connh, MDS_DISCONNECT, 0, NULL, NULL);
+ mdc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
+ MDS_DISCONNECT, 0, NULL, NULL);
if (!request)
RETURN(-ENOMEM);
case OBD_IOC_BRW_WRITE:
rw = OBD_BRW_WRITE;
case OBD_IOC_BRW_READ: {
- /* FIXME: use a better ioctl data struct than obd_ioctl_data.
- * We don't really support multiple-obdo I/Os here,
- * for example offset and count are not per-obdo.
- */
- struct lov_stripe_md *md;
+ struct lov_stripe_md smd;
obd_count pages = 0;
struct page **bufs = NULL;
obd_size *counts = NULL;
GOTO(brw_free, err = -ENOMEM);
}
- md = &data->ioc_obdo1;
+ memset(&smd, 0, sizeof(smd));
+ smd.lmd_object_id = data->ioc_obdo1.o_id;
from = (&data->ioc_pbuf1)[0];
off = data->ioc_offset;
flags[j] = 0;
}
- err = obd_brw(rw, &conn, md, j, bufs, counts, offsets, flags,
+ err = obd_brw(rw, &conn, &smd, j, bufs, counts, offsets, flags,
NULL);
EXIT;
EXPORT_SYMBOL(class_uuid2obd);
EXPORT_SYMBOL(class_connect);
EXPORT_SYMBOL(class_conn2export);
+EXPORT_SYMBOL(class_import2export);
EXPORT_SYMBOL(class_conn2obd);
EXPORT_SYMBOL(class_disconnect);
//EXPORT_SYMBOL(class_multi_setup);
struct obd_export * export;
if (!conn)
+ RETURN(NULL);
+
+ if (conn->addr == -1) /* this means assign a new connection */
RETURN(NULL);
- if (!conn->addr || conn->addr == -1 ) {
+ if (!conn->addr) {
fixme();
RETURN(NULL);
}
-
+
export = (struct obd_export *) (unsigned long)conn->addr;
if (!kmem_cache_validate(export_cachep, (void *)export))
RETURN(NULL);
memset(export, 0, sizeof(*export));
get_random_bytes(&export->export_cookie, sizeof(__u64));
- export->export_obd = obd;
+ export->export_obd = obd;
export->export_import.addr = conn->addr;
export->export_import.cookie = conn->cookie;
-
+
list_add(&(export->export_chain), export->export_obd->obd_exports.prev);
conn->addr = (__u64) (unsigned long)export;
conn->cookie = export->export_cookie;
+ CDEBUG(D_IOCTL, "connect: addr %Lx cookie %Lx\n",
+ (long long)conn->addr, (long long)conn->cookie);
return 0;
-}
+}
+
+int class_import2export(struct lustre_handle *conn, struct lustre_handle *imp)
+{
+ struct obd_export *export = class_conn2export(conn);
+
+ if (!export)
+ return -EINVAL;
+
+ export->export_import.addr = imp->addr;
+ export->export_import.cookie = imp->cookie;
+
+ return 0;
+}
int class_disconnect(struct lustre_handle *conn)
{
CDEBUG(D_IOCTL, "disconnect: attempting to free "
"nonexistent client %Lx\n", conn->addr);
RETURN(-EINVAL);
- }
+ } else
+ CDEBUG(D_IOCTL, "disconnect: addr %Lx cookie %Lx\n",
+ (long long)conn->addr, (long long)conn->cookie);
list_del(&export->export_chain);
kmem_cache_free(export_cachep, export);
#include <linux/obd_lov.h>
static void osc_con2cl(struct lustre_handle *conn, struct ptlrpc_client **cl,
- struct ptlrpc_connection **connection)
+ struct ptlrpc_connection **connection,
+ struct lustre_handle **rconn)
{
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
+ struct obd_export *export = class_conn2export(conn);
+ struct osc_obd *osc = &export->export_obd->u.osc;
*cl = osc->osc_client;
*connection = osc->osc_conn;
+ *rconn = &export->export_import;
}
static void osc_con2dlmcl(struct lustre_handle *conn, struct ptlrpc_client **cl,
- struct ptlrpc_connection **connection)
+ struct ptlrpc_connection **connection,
+ struct lustre_handle **rconn)
{
struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
*cl = osc->osc_ldlm_client;
request->rq_level = LUSTRE_CONN_NEW;
request->rq_replen = lustre_msg_size(0, NULL);
+ request->rq_reqmsg->addr = -1;
+ /* Sending our local connection info breaks for local connections
+ request->rq_reqmsg->addr = conn->addr;
+ request->rq_reqmsg->cookie = conn->cookie;
+ */
rc = ptlrpc_queue_wait(request);
rc = ptlrpc_check_status(request, rc);
/* XXX eventually maybe more refinement */
osc->osc_conn->c_level = LUSTRE_CONN_FULL;
- /* XXX: Make this a handle */
- osc->osc_connh.addr = request->rq_repmsg->addr;
- osc->osc_connh.cookie = request->rq_repmsg->cookie;
+ class_import2export(conn, (struct lustre_handle *)request->rq_repmsg);
EXIT;
out:
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
+ struct lustre_handle *rconn;
int rc;
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
- OST_DISCONNECT, 0, NULL, NULL);
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
+ OST_DISCONNECT, 0, NULL, NULL);
if (!request)
RETURN(-ENOMEM);
request->rq_replen = lustre_msg_size(0, NULL);
{
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_GETATTR, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
{
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_OPEN, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
{
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_CLOSE, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
{
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_SETATTR, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
(*ea)->lmd_size = oa->o_easize;
}
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_CREATE, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
CERROR("oa NULL\n");
RETURN(-EINVAL);
}
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_PUNCH, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
+ struct lustre_handle *rconn;
struct ost_body *body;
int rc, size = sizeof(*body);
ENTRY;
CERROR("oa NULL\n");
RETURN(-EINVAL);
}
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_DESTROY, 1, &size, NULL);
if (!request)
RETURN(-ENOMEM);
{
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *request = NULL;
struct ptlrpc_bulk_desc *desc = NULL;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ost_body *body;
int rc, j, size[3] = {sizeof(*body)};
void *iooptr, *nioptr;
size[1] = sizeof(struct obd_ioobj);
size[2] = page_count * sizeof(struct niobuf_remote);
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_BRW, 3, size, NULL);
if (!request)
RETURN(-ENOMEM);
{
struct ptlrpc_client *cl;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct ptlrpc_request *request = NULL;
struct ptlrpc_bulk_desc *desc = NULL;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ost_body *body;
struct niobuf_local *local = NULL;
struct niobuf_remote *remote;
size[1] = sizeof(struct obd_ioobj);
size[2] = page_count * sizeof(*remote);
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_BRW, 3, size, NULL);
if (!request)
RETURN(-ENOMEM);
offset, flags, (bulk_callback_t)callback);
}
-static int osc_enqueue(struct lustre_handle *oconn,
+static int osc_enqueue(struct lustre_handle *conn,
struct lustre_handle *parent_lock, __u64 *res_id,
__u32 type, void *extentp, int extent_len, __u32 mode,
int *flags, void *callback, void *data, int datalen,
struct lustre_handle *lockh)
{
- struct obd_device *obddev = class_conn2obd(oconn);
- struct osc_obd *osc = &obddev->u.osc;
- struct ptlrpc_connection *conn;
+ struct obd_device *obddev = class_conn2obd(conn);
+ struct ptlrpc_connection *connection;
struct ptlrpc_client *cl;
+ struct lustre_handle *rconn;
struct ldlm_extent *extent = extentp;
int rc;
__u32 mode2;
extent->end = (extent->end + PAGE_SIZE - 1) & PAGE_MASK;
/* Next, search for already existing extent locks that will cover us */
- osc_con2dlmcl(oconn, &cl, &conn);
+ osc_con2dlmcl(conn, &cl, &connection, &rconn);
rc = ldlm_lock_match(obddev->obd_namespace, res_id, type, extent,
sizeof(extent), mode, lockh);
if (rc == 1) {
if (mode == LCK_PR)
return 0;
- rc = ldlm_cli_convert(cl, lockh, &osc->osc_connh,
- mode, &flags);
+ rc = ldlm_cli_convert(cl, lockh, rconn, mode, &flags);
if (rc)
LBUG();
return rc;
}
- rc = ldlm_cli_enqueue(cl, conn, &osc->osc_connh,
- NULL, obddev->obd_namespace,
+ rc = ldlm_cli_enqueue(cl, connection, rconn, NULL,obddev->obd_namespace,
parent_lock, res_id, type, extent, sizeof(extent),
mode, flags, callback, data, datalen, lockh);
return rc;
{
struct ptlrpc_request *request;
struct ptlrpc_client *cl;
- struct osc_obd *osc = &class_conn2obd(conn)->u.osc;
struct ptlrpc_connection *connection;
+ struct lustre_handle *rconn;
struct obd_statfs *osfs;
int rc, size = sizeof(*osfs);
ENTRY;
- osc_con2cl(conn, &cl, &connection);
- request = ptlrpc_prep_req2(cl, connection, &osc->osc_connh,
+ osc_con2cl(conn, &cl, &connection, &rconn);
+ request = ptlrpc_prep_req2(cl, connection, rconn,
OST_STATFS, 0, NULL, NULL);
if (!request)
RETURN(-ENOMEM);
{
int i, offset;
+ if (!m) {
+ CERROR("no message buffer!\n");
+ LBUG();
+ return NULL;
+ }
+
if (n < 0 || n >= m->bufcount) {
CERROR("referencing bad sub buffer!\n");
LBUG();