target: Make all control CDBs scatter-gather
[pandora-kernel.git] / drivers / target / tcm_fc / tfc_io.c
index 8560182..8376607 100644 (file)
@@ -92,19 +92,15 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
        remaining = se_cmd->data_length;
 
        /*
-        * Setup to use first mem list entry if any.
+        * Setup to use first mem list entry, unless no data.
         */
-       if (se_cmd->t_tasks_se_num) {
+       BUG_ON(remaining && list_empty(&se_cmd->t_mem_list));
+       if (remaining) {
                mem = list_first_entry(&se_cmd->t_mem_list,
                         struct se_mem, se_list);
                mem_len = mem->se_len;
                mem_off = mem->se_off;
                page = mem->se_page;
-       } else {
-               mem = NULL;
-               mem_len = remaining;
-               mem_off = 0;
-               page = NULL;
        }
 
        /* no scatter/gather in skb for odd word length due to fc_seq_send() */
@@ -145,18 +141,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
                tlen = min(mem_len, frame_len);
 
                if (use_sg) {
-                       if (!mem) {
-                               BUG_ON(!se_cmd->t_task_buf);
-                               page_addr = se_cmd->t_task_buf + mem_off;
-                               /*
-                                * In this case, offset is 'offset_in_page' of
-                                * (t_task_buf + mem_off) instead of 'mem_off'.
-                                */
-                               off_in_page = offset_in_page(page_addr);
-                               page = virt_to_page(page_addr);
-                               tlen = min(tlen, PAGE_SIZE - off_in_page);
-                       } else
-                               off_in_page = mem_off;
+                       off_in_page = mem_off;
                        BUG_ON(!page);
                        get_page(page);
                        skb_fill_page_desc(fp_skb(fp),
@@ -166,7 +151,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
                        fp_skb(fp)->data_len += tlen;
                        fp_skb(fp)->truesize +=
                                        PAGE_SIZE << compound_order(page);
-               } else if (mem) {
+               } else {
                        BUG_ON(!page);
                        from = kmap_atomic(page + (mem_off >> PAGE_SHIFT),
                                           KM_SOFTIRQ0);
@@ -177,10 +162,6 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
                        memcpy(to, from, tlen);
                        kunmap_atomic(page_addr, KM_SOFTIRQ0);
                        to += tlen;
-               } else {
-                       from = se_cmd->t_task_buf + mem_off;
-                       memcpy(to, from, tlen);
-                       to += tlen;
                }
 
                mem_off += tlen;
@@ -305,19 +286,15 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
                frame_len = se_cmd->data_length - rel_off;
 
        /*
-        * Setup to use first mem list entry if any.
+        * Setup to use first mem list entry, unless no data.
         */
-       if (se_cmd->t_tasks_se_num) {
+       BUG_ON(frame_len && list_empty(&se_cmd->t_mem_list));
+       if (frame_len) {
                mem = list_first_entry(&se_cmd->t_mem_list,
                                       struct se_mem, se_list);
                mem_len = mem->se_len;
                mem_off = mem->se_off;
                page = mem->se_page;
-       } else {
-               mem = NULL;
-               page = NULL;
-               mem_off = 0;
-               mem_len = frame_len;
        }
 
        while (frame_len) {
@@ -340,19 +317,15 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
 
                tlen = min(mem_len, frame_len);
 
-               if (mem) {
-                       to = kmap_atomic(page + (mem_off >> PAGE_SHIFT),
-                                        KM_SOFTIRQ0);
-                       page_addr = to;
-                       to += mem_off & ~PAGE_MASK;
-                       tlen = min(tlen, (size_t)(PAGE_SIZE -
-                                               (mem_off & ~PAGE_MASK)));
-                       memcpy(to, from, tlen);
-                       kunmap_atomic(page_addr, KM_SOFTIRQ0);
-               } else {
-                       to = se_cmd->t_task_buf + mem_off;
-                       memcpy(to, from, tlen);
-               }
+               to = kmap_atomic(page + (mem_off >> PAGE_SHIFT),
+                                KM_SOFTIRQ0);
+               page_addr = to;
+               to += mem_off & ~PAGE_MASK;
+               tlen = min(tlen, (size_t)(PAGE_SIZE -
+                                         (mem_off & ~PAGE_MASK)));
+               memcpy(to, from, tlen);
+               kunmap_atomic(page_addr, KM_SOFTIRQ0);
+
                from += tlen;
                frame_len -= tlen;
                mem_off += tlen;