Re: [PATCH 1/1] scsi: fcoe: return value of skb_linearize should be handled

2016-12-07 Thread Zhouyi Zhou
Thanks Johannes for reviewing, your code is indeeded more elegant

On Wed, Dec 7, 2016 at 4:28 PM, Johannes Thumshirn <jthumsh...@suse.de> wrote:
> Hi Zhouyi,
> On Wed, Dec 07, 2016 at 04:00:00PM +0800, Zhouyi Zhou wrote:
>> Return value of skb_linearize should be handled.
>>
>> Signed-off-by: Zhouyi Zhou <yizhouz...@ict.ac.cn>
>> Reviewed-by: Yuval Shaia <yuval.sh...@oracle.com>
>> ---
>>  drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 6 --
>>  drivers/scsi/fcoe/fcoe.c  | 5 -
>>  2 files changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c 
>> b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
>> index f9ddb61..142f7e2 100644
>> --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
>> +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
>> @@ -542,8 +542,10 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
>>   return;
>>   }
>>
>> - if (skb_is_nonlinear(skb))
>> - skb_linearize(skb);
>> + if (skb_linearize(skb)) {
>> + kfree_skb(skb);
>> + return;
>> + }
>>   mac = eth_hdr(skb)->h_source;
>>   dest_mac = eth_hdr(skb)->h_dest;
>>
>> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
>> index 9bd41a3..4e3499c 100644
>> --- a/drivers/scsi/fcoe/fcoe.c
>> +++ b/drivers/scsi/fcoe/fcoe.c
>> @@ -1685,7 +1685,10 @@ static void fcoe_recv_frame(struct sk_buff *skb)
>>   skb->dev ? skb->dev->name : "");
>>
>>   port = lport_priv(lport);
>> - skb_linearize(skb); /* check for skb_is_nonlinear is within 
>> skb_linearize */
>> + if (skb_linearize(skb)) {
>> + kfree_skb(skb);
>> + return;
>> + }
>>
>>   /*
>>* Frame length checks and setting up the header pointers
>> --
>> 1.9.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
>> the body of a message to majord...@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
> I'd personally prefer something like:
>
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index 9bd41a3..bc6fa6c 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -1673,8 +1673,7 @@ static void fcoe_recv_frame(struct sk_buff *skb)
> lport = fr->fr_dev;
> if (unlikely(!lport)) {
> FCOE_NETDEV_DBG(skb->dev, "NULL lport in skb\n");
> -   kfree_skb(skb);
> -   return;
> +   goto free_skb;
> }
>
> FCOE_NETDEV_DBG(skb->dev,
> @@ -1685,8 +1684,8 @@ static void fcoe_recv_frame(struct sk_buff *skb)
> skb->dev ? skb->dev->name : "");
>
> port = lport_priv(lport);
> -   skb_linearize(skb); /* check for skb_is_nonlinear is within 
> skb_linearize */
> -
> +   if (skb_linearize(skb))
> +   goto free_skb;
> /*
>  * Frame length checks and setting up the header pointers
>  * was done in fcoe_rcv already.
> @@ -1732,6 +1731,7 @@ static void fcoe_recv_frame(struct sk_buff *skb)
>  drop:
> stats->ErrorFrames++;
> put_cpu();
> +free_skb:
> kfree_skb(skb);
>  }
>
>
> For bnx2fc as well if Chad agrees.
>
> Thanks,
> Johannes
>
> --
> Johannes Thumshirn  Storage
> jthumsh...@suse.de+49 911 74053 689
> SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
> GF: Felix Imendörffer, Jane Smithard, Graham Norton
> HRB 21284 (AG Nürnberg)
> Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
Thanks
Zhouyi
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[PATCH 1/1] scsi: fcoe: return value of skb_linearize should be handled

2016-12-07 Thread Zhouyi Zhou
Return value of skb_linearize should be handled.

Signed-off-by: Zhouyi Zhou <yizhouz...@ict.ac.cn>
Reviewed-by: Yuval Shaia <yuval.sh...@oracle.com> 
---
 drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 6 --
 drivers/scsi/fcoe/fcoe.c  | 5 -
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c 
b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index f9ddb61..142f7e2 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -542,8 +542,10 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
return;
}
 
-   if (skb_is_nonlinear(skb))
-   skb_linearize(skb);
+   if (skb_linearize(skb)) {
+   kfree_skb(skb);
+   return;
+   }
mac = eth_hdr(skb)->h_source;
dest_mac = eth_hdr(skb)->h_dest;
 
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 9bd41a3..4e3499c 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1685,7 +1685,10 @@ static void fcoe_recv_frame(struct sk_buff *skb)
skb->dev ? skb->dev->name : "");
 
port = lport_priv(lport);
-   skb_linearize(skb); /* check for skb_is_nonlinear is within 
skb_linearize */
+   if (skb_linearize(skb)) {
+   kfree_skb(skb);
+   return;
+   }
 
/*
 * Frame length checks and setting up the header pointers
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] net: return value of skb_linearize should be handled in Linux kernel

2016-12-06 Thread Zhouyi Zhou
On Wed, Dec 7, 2016 at 1:02 PM, Cong Wang <xiyou.wangc...@gmail.com> wrote:
> On Mon, Dec 5, 2016 at 11:10 PM, Zhouyi Zhou <zhouzho...@gmail.com> wrote:
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c 
>> b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> index 2a653ec..ab787cb 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> @@ -490,7 +490,11 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
>>  */
>> if ((fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA) &&
>> (fctl & FC_FC_END_SEQ)) {
>> -   skb_linearize(skb);
>> +   int err = 0;
>> +
>> +   err = skb_linearize(skb);
>> +   if (err)
>> +   return err;
>
>
> You can reuse 'rc' instead of adding 'err'.
rc here is meaningful for the length of data being ddped. If using rc
here, a successful
skb_linearize will assign rc to 0.
>
>
>
>> crc = (struct fcoe_crc_eof *)skb_put(skb, sizeof(*crc));
>> crc->fcoe_eof = FC_EOF_T;
>> }
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
>> b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
>> index fee1f29..4926d48 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
>> @@ -2173,8 +2173,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector 
>> *q_vector,
>> total_rx_bytes += ddp_bytes;
>> total_rx_packets += DIV_ROUND_UP(ddp_bytes,
>>  mss);
>> -   }
>> -   if (!ddp_bytes) {
>> +   } else {
>> dev_kfree_skb_any(skb);
>> continue;
>> }
>
>
> This piece doesn't seem to be related.
if ddp_bytes is negative there will be some error, I think the skb
should not pass to upper layer.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] net: return value of skb_linearize should be handled in Linux kernel

2016-12-05 Thread Zhouyi Zhou
kmalloc_reserve may fail to allocate memory inside skb_linearize, 
which means skb_linearize's return value should not be ignored. 
Following patch correct the uses of skb_linearize.

Compiled in x86_64

Signed-off-by: Zhouyi Zhou <zhouzho...@gmail.com>
---
 drivers/infiniband/hw/nes/nes_nic.c   | 5 +++--
 drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 6 +-
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 +--
 drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 7 +--
 drivers/scsi/fcoe/fcoe.c  | 5 -
 net/tipc/link.c   | 3 ++-
 net/tipc/name_distr.c | 5 -
 7 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/hw/nes/nes_nic.c 
b/drivers/infiniband/hw/nes/nes_nic.c
index 2b27d13..69372ea 100644
--- a/drivers/infiniband/hw/nes/nes_nic.c
+++ b/drivers/infiniband/hw/nes/nes_nic.c
@@ -662,10 +662,11 @@ static int nes_netdev_start_xmit(struct sk_buff *skb, 
struct net_device *netdev)
nesnic->sq_head &= nesnic->sq_size-1;
}
} else {
-   nesvnic->linearized_skbs++;
hoffset = skb_transport_header(skb) - skb->data;
nhoffset = skb_network_header(skb) - skb->data;
-   skb_linearize(skb);
+   if (skb_linearize(skb))
+   return NETDEV_TX_BUSY;
+   nesvnic->linearized_skbs++;
skb_set_transport_header(skb, hoffset);
skb_set_network_header(skb, nhoffset);
if (!nes_nic_send(skb, netdev))
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
index 2a653ec..ab787cb 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
@@ -490,7 +490,11 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
 */
if ((fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA) &&
(fctl & FC_FC_END_SEQ)) {
-   skb_linearize(skb);
+   int err = 0;
+
+   err = skb_linearize(skb);
+   if (err)
+   return err;
crc = (struct fcoe_crc_eof *)skb_put(skb, sizeof(*crc));
crc->fcoe_eof = FC_EOF_T;
}
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index fee1f29..4926d48 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -2173,8 +2173,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector 
*q_vector,
total_rx_bytes += ddp_bytes;
total_rx_packets += DIV_ROUND_UP(ddp_bytes,
 mss);
-   }
-   if (!ddp_bytes) {
+   } else {
dev_kfree_skb_any(skb);
continue;
}
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c 
b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index f9ddb61..197d02e 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -542,8 +542,11 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
return;
}
 
-   if (skb_is_nonlinear(skb))
-   skb_linearize(skb);
+   if (skb_linearize(skb)) {
+   kfree_skb(skb);
+   return;
+   }
+
mac = eth_hdr(skb)->h_source;
dest_mac = eth_hdr(skb)->h_dest;
 
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 9bd41a3..f691b97 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1685,7 +1685,10 @@ static void fcoe_recv_frame(struct sk_buff *skb)
skb->dev ? skb->dev->name : "");
 
port = lport_priv(lport);
-   skb_linearize(skb); /* check for skb_is_nonlinear is within 
skb_linearize */
+   if (skb_linearize(skb)) {
+   kfree_skb(skb);
+   return;
+   }
 
/*
 * Frame length checks and setting up the header pointers
diff --git a/net/tipc/link.c b/net/tipc/link.c
index bda89bf..077c570 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1446,7 +1446,8 @@ static int tipc_link_proto_rcv(struct tipc_link *l, 
struct sk_buff *skb,
if (tipc_own_addr(l->net) > msg_prevnode(hdr))
l->net_plane = msg_net_plane(hdr);
 
-   skb_linearize(skb);
+   if (skb_linearize(skb))
+   goto exit;
hdr = buf_msg(skb);
data = msg_data(hdr);
 
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
index c1cfd92..4e05d2a 100644
--- a/net/tipc/name_distr.c