Whamcloud - gitweb
LU-7414 target: do not share update and rdbuf 29/17129/3
authorDi Wang <di.wang@intel.com>
Tue, 10 Nov 2015 10:12:00 +0000 (02:12 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 17 Nov 2015 15:32:14 +0000 (15:32 +0000)
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>
lustre/include/lu_object.h
lustre/target/out_handler.c
lustre/target/tgt_handler.c
lustre/target/tgt_internal.h

index 12fee04..69e8abb 100644 (file)
@@ -905,16 +905,6 @@ struct lu_rdpg {
         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)
@@ -1349,6 +1339,15 @@ struct lu_buf {
 
 #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.
index 5d771a7..b38e1eb 100644 (file)
@@ -599,7 +599,7 @@ static int out_read(struct tgt_session_info *tsi)
        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;
@@ -638,8 +638,9 @@ static int out_read(struct tgt_session_info *tsi)
        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;
@@ -647,19 +648,15 @@ static int out_read(struct tgt_session_info *tsi)
        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;
-               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);
 
-               rdbuf->rb_bufs[i]->lb_len = read_size;
+               rdbuf->rb_bufs[i].lb_len = read_size;
                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;
@@ -670,7 +667,6 @@ static int out_read(struct tgt_session_info *tsi)
                size -= read_size;
        }
 
-       rdbuf->rb_bytes = total_size;
        /* send pages to client */
        rc = tgt_send_buffer(tsi, rdbuf);
        if (rc < 0)
@@ -683,13 +679,13 @@ static int out_read(struct tgt_session_info *tsi)
        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);
index 80de14a..e65269f 100644 (file)
@@ -1078,7 +1078,7 @@ int tgt_send_buffer(struct tgt_session_info *tsi, struct lu_rdbuf *rdbuf)
        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;
        int                      i;
        int                      rc;
 
@@ -1092,8 +1092,8 @@ int tgt_send_buffer(struct tgt_session_info *tsi, struct lu_rdbuf *rdbuf)
 
        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);
index 9a1aeb3..824a9c7 100644 (file)
@@ -77,18 +77,13 @@ struct tgt_thread_info {
                        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 l_wait_info tti_wait_info;
                } update;
        } tti_u;
        struct lfsck_request tti_lr;