Redefine lu_rdbuf structure to simplify the rdbuf
allocation in out_read().
And also move tti_u.rdbuf out of tgt_thread_info
union, otherwise rdbuf and update will share
the same memory and cause corruption, see out_read().
Signed-off-by: Di Wang <di.wang@intel.com>
Change-Id: Idb0f5af1b00fd5fd15ebc8742aa60d9a43df0a8a
Reviewed-on: http://review.whamcloud.com/17129
Tested-by: Jenkins
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
struct page **rp_pages;
};
struct page **rp_pages;
};
-/* read buffer params, should be filled out by out */
-struct lu_rdbuf {
- /** count in bytes */
- unsigned int rb_bytes;
- /** number of pages */
- unsigned int rb_nbufs;
- /** pointers to pages */
- struct lu_buf **rb_bufs;
-};
-
enum lu_xattr_flags {
LU_XATTR_REPLACE = (1 << 0),
LU_XATTR_CREATE = (1 << 1)
enum lu_xattr_flags {
LU_XATTR_REPLACE = (1 << 0),
LU_XATTR_CREATE = (1 << 1)
#define DLUBUF "(%p %zu)"
#define PLUBUF(buf) (buf)->lb_buf, (buf)->lb_len
#define DLUBUF "(%p %zu)"
#define PLUBUF(buf) (buf)->lb_buf, (buf)->lb_len
+
+/* read buffer params, should be filled out by out */
+struct lu_rdbuf {
+ /** number of buffers */
+ unsigned int rb_nbufs;
+ /** pointers to buffers */
+ struct lu_buf rb_bufs[];
+};
+
/**
* One-time initializers, called at obdclass module initialization, not
* exported.
/**
* One-time initializers, called at obdclass module initialization, not
* exported.
struct dt_object *obj = tti->tti_u.update.tti_dt_object;
struct object_update_reply *reply = tti->tti_u.update.tti_update_reply;
int index = tti->tti_u.update.tti_update_reply_index;
struct dt_object *obj = tti->tti_u.update.tti_dt_object;
struct object_update_reply *reply = tti->tti_u.update.tti_update_reply;
int index = tti->tti_u.update.tti_update_reply_index;
- struct lu_rdbuf *rdbuf = &tti->tti_u.rdbuf.tti_rdbuf;
+ struct lu_rdbuf *rdbuf;
struct object_update_result *update_result;
struct out_read_reply *orr;
void *tmp;
struct object_update_result *update_result;
struct out_read_reply *orr;
void *tmp;
orr = (struct out_read_reply *)update_result->our_data;
nbufs = (size + OUT_BULK_BUFFER_SIZE - 1) / OUT_BULK_BUFFER_SIZE;
orr = (struct out_read_reply *)update_result->our_data;
nbufs = (size + OUT_BULK_BUFFER_SIZE - 1) / OUT_BULK_BUFFER_SIZE;
- OBD_ALLOC(rdbuf->rb_bufs, nbufs * sizeof(rdbuf->rb_bufs[0]));
- if (rdbuf->rb_bufs == NULL)
+ OBD_ALLOC(rdbuf, sizeof(struct lu_rdbuf) +
+ nbufs * sizeof(rdbuf->rb_bufs[0]));
+ if (rdbuf == NULL)
GOTO(out, rc = -ENOMEM);
rdbuf->rb_nbufs = 0;
GOTO(out, rc = -ENOMEM);
rdbuf->rb_nbufs = 0;
for (i = 0; i < nbufs; i++) {
__u32 read_size;
for (i = 0; i < nbufs; i++) {
__u32 read_size;
- OBD_ALLOC_PTR(rdbuf->rb_bufs[i]);
- if (rdbuf->rb_bufs[i] == NULL)
- GOTO(out_free, rc = -ENOMEM);
-
read_size = size > OUT_BULK_BUFFER_SIZE ?
OUT_BULK_BUFFER_SIZE : size;
read_size = size > OUT_BULK_BUFFER_SIZE ?
OUT_BULK_BUFFER_SIZE : size;
- OBD_ALLOC(rdbuf->rb_bufs[i]->lb_buf, read_size);
- if (rdbuf->rb_bufs[i] == NULL)
+ OBD_ALLOC(rdbuf->rb_bufs[i].lb_buf, read_size);
+ if (rdbuf->rb_bufs[i].lb_buf == NULL)
GOTO(out_free, rc = -ENOMEM);
GOTO(out_free, rc = -ENOMEM);
- rdbuf->rb_bufs[i]->lb_len = read_size;
+ rdbuf->rb_bufs[i].lb_len = read_size;
dt_read_lock(env, obj, MOR_TGT_CHILD);
dt_read_lock(env, obj, MOR_TGT_CHILD);
- rc = dt_read(env, obj, rdbuf->rb_bufs[i], &pos);
+ rc = dt_read(env, obj, &rdbuf->rb_bufs[i], &pos);
dt_read_unlock(env, obj);
total_size += rc < 0 ? 0 : rc;
dt_read_unlock(env, obj);
total_size += rc < 0 ? 0 : rc;
- rdbuf->rb_bytes = total_size;
/* send pages to client */
rc = tgt_send_buffer(tsi, rdbuf);
if (rc < 0)
/* send pages to client */
rc = tgt_send_buffer(tsi, rdbuf);
if (rc < 0)
update_result->our_datalen += orr->orr_size;
out_free:
for (i = 0; i < nbufs; i++) {
update_result->our_datalen += orr->orr_size;
out_free:
for (i = 0; i < nbufs; i++) {
- if (rdbuf->rb_bufs[i] != NULL) {
- OBD_FREE(rdbuf->rb_bufs[i]->lb_buf,
- rdbuf->rb_bufs[i]->lb_len);
- OBD_FREE_PTR(rdbuf->rb_bufs[i]);
+ if (rdbuf->rb_bufs[i].lb_buf != NULL) {
+ OBD_FREE(rdbuf->rb_bufs[i].lb_buf,
+ rdbuf->rb_bufs[i].lb_len);
- OBD_FREE(rdbuf->rb_bufs, nbufs * sizeof(rdbuf->rb_bufs[0]));
+ OBD_FREE(rdbuf, sizeof(struct lu_rdbuf) +
+ nbufs * sizeof(rdbuf->rb_bufs[0]));
out:
/* Insert read buffer */
update_result->our_rc = ptlrpc_status_hton(rc);
out:
/* Insert read buffer */
update_result->our_rc = ptlrpc_status_hton(rc);
struct ptlrpc_request *req = tgt_ses_req(tsi);
struct obd_export *exp = req->rq_export;
struct ptlrpc_bulk_desc *desc;
struct ptlrpc_request *req = tgt_ses_req(tsi);
struct obd_export *exp = req->rq_export;
struct ptlrpc_bulk_desc *desc;
- struct l_wait_info *lwi = &tti->tti_u.rdbuf.tti_wait_info;
+ struct l_wait_info *lwi = &tti->tti_u.update.tti_wait_info;
for (i = 0; i < rdbuf->rb_nbufs; i++)
desc->bd_frag_ops->add_iov_frag(desc,
for (i = 0; i < rdbuf->rb_nbufs; i++)
desc->bd_frag_ops->add_iov_frag(desc,
- rdbuf->rb_bufs[i]->lb_buf,
- rdbuf->rb_bufs[i]->lb_len);
+ rdbuf->rb_bufs[i].lb_buf,
+ rdbuf->rb_bufs[i].lb_len);
rc = target_bulk_io(exp, desc, lwi);
ptlrpc_free_bulk(desc);
rc = target_bulk_io(exp, desc, lwi);
ptlrpc_free_bulk(desc);
struct l_wait_info tti_wait_info;
} rdpg;
struct {
struct l_wait_info tti_wait_info;
} rdpg;
struct {
- /* for out_read() */
- struct lu_rdbuf tti_rdbuf;
- /* for tgt_sendpage() */
- struct l_wait_info tti_wait_info;
- } rdbuf;
- struct {
struct dt_object_format tti_update_dof;
struct object_update_reply *tti_update_reply;
struct object_update *tti_update;
int tti_update_reply_index;
struct obdo tti_obdo;
struct dt_object *tti_dt_object;
struct dt_object_format tti_update_dof;
struct object_update_reply *tti_update_reply;
struct object_update *tti_update;
int tti_update_reply_index;
struct obdo tti_obdo;
struct dt_object *tti_dt_object;
+ struct l_wait_info tti_wait_info;
} update;
} tti_u;
struct lfsck_request tti_lr;
} update;
} tti_u;
struct lfsck_request tti_lr;