The fix for bug 18631 introduced an interop bug for 1.8.x clients with 2.0 OSTs.
The problem was that a zero-length RMF_RCS was included in the OST_BRW replies
for READs, which caused the RPC header to have eight more bytes for storing the
length of that zero-length buffer. The fix is to split RQF_OST_BRW into two,
one for READs and one for WRITEs, with RMF_RCS present only in the reply for
OST_BRW_WRITE.
i=robert.read@sun.com
i=tom.wang@sun.com
extern const struct req_format RQF_OST_PUNCH;
extern const struct req_format RQF_OST_SYNC;
extern const struct req_format RQF_OST_DESTROY;
-extern const struct req_format RQF_OST_BRW;
+extern const struct req_format RQF_OST_BRW_READ;
+extern const struct req_format RQF_OST_BRW_WRITE;
extern const struct req_format RQF_OST_STATFS;
extern const struct req_format RQF_OST_SET_GRANT_INFO;
extern const struct req_format RQF_OST_GET_INFO_GENERIC;
opc = OST_WRITE;
req = ptlrpc_request_alloc_pool(cli->cl_import,
cli->cl_import->imp_rq_pool,
- &RQF_OST_BRW);
+ &RQF_OST_BRW_WRITE);
} else {
opc = OST_READ;
- req = ptlrpc_request_alloc(cli->cl_import, &RQF_OST_BRW);
+ req = ptlrpc_request_alloc(cli->cl_import, &RQF_OST_BRW_READ);
}
if (req == NULL)
RETURN(-ENOMEM);
body->oa.o_flags |= cksum_type_pack(cli->cl_cksum_type);
body->oa.o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
}
- req_capsule_set_size(pill, &RMF_RCS, RCL_SERVER, 0);
- /* 1 RC for the whole I/O */
}
ptlrpc_request_set_replen(req);
}
}
- req_capsule_set_size(&req->rq_pill, &RMF_RCS, RCL_SERVER, 0);
rc = req_capsule_server_pack(&req->rq_pill);
if (rc)
GOTO(out, rc);
* it doesn't change).
*/
req_capsule_init(&req->rq_pill, req, RCL_SERVER);
- req_capsule_set(&req->rq_pill, &RQF_OST_BRW);
+ if (opc == OST_READ)
+ req_capsule_set(&req->rq_pill,
+ &RQF_OST_BRW_READ);
+ else
+ req_capsule_set(&req->rq_pill,
+ &RQF_OST_BRW_WRITE);
body = req_capsule_client_get(&req->rq_pill,
&RMF_OST_BODY);
rc = ost_setattr(req->rq_export, req, oti);
break;
case OST_WRITE:
- req_capsule_set(&req->rq_pill, &RQF_OST_BRW);
+ req_capsule_set(&req->rq_pill, &RQF_OST_BRW_WRITE);
CDEBUG(D_INODE, "write\n");
/* req->rq_request_portal would be nice, if it was set */
if (req->rq_rqbd->rqbd_service->srv_req_portal !=OST_IO_PORTAL){
/* ost_brw_write sends its own replies */
RETURN(rc);
case OST_READ:
- req_capsule_set(&req->rq_pill, &RQF_OST_BRW);
+ req_capsule_set(&req->rq_pill, &RQF_OST_BRW_READ);
CDEBUG(D_INODE, "read\n");
/* req->rq_request_portal would be nice, if it was set */
if (req->rq_rqbd->rqbd_service->srv_req_portal !=OST_IO_PORTAL){
&RMF_CAPA1
};
-static const struct req_msg_field *ost_brw_server[] = {
+static const struct req_msg_field *ost_brw_read_server[] = {
+ &RMF_PTLRPC_BODY,
+ &RMF_OST_BODY
+};
+
+static const struct req_msg_field *ost_brw_write_server[] = {
&RMF_PTLRPC_BODY,
&RMF_OST_BODY,
&RMF_RCS
&RQF_OST_PUNCH,
&RQF_OST_SYNC,
&RQF_OST_DESTROY,
- &RQF_OST_BRW,
+ &RQF_OST_BRW_READ,
+ &RQF_OST_BRW_WRITE,
&RQF_OST_STATFS,
&RQF_OST_SET_GRANT_INFO,
&RQF_OST_GET_INFO_GENERIC,
DEFINE_REQ_FMT0("OST_DESTROY", ost_destroy_client, ost_body_only);
EXPORT_SYMBOL(RQF_OST_DESTROY);
-const struct req_format RQF_OST_BRW =
- DEFINE_REQ_FMT0("OST_BRW", ost_brw_client, ost_brw_server);
-EXPORT_SYMBOL(RQF_OST_BRW);
+const struct req_format RQF_OST_BRW_READ =
+ DEFINE_REQ_FMT0("OST_BRW_READ", ost_brw_client, ost_brw_read_server);
+EXPORT_SYMBOL(RQF_OST_BRW_READ);
+
+const struct req_format RQF_OST_BRW_WRITE =
+ DEFINE_REQ_FMT0("OST_BRW_WRITE", ost_brw_client, ost_brw_write_server);
+EXPORT_SYMBOL(RQF_OST_BRW_WRITE);
const struct req_format RQF_OST_STATFS =
DEFINE_REQ_FMT0("OST_STATFS", empty, obd_statfs_server);