diff options
author | Yi Zou <yi.zou@intel.com> | 2009-10-21 19:27:58 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:00:33 -0500 |
commit | d37322a43ebac79eef417149f5696390cf8872db (patch) | |
tree | 71538cfff1bc2bd82e744ece265e7e6c45c07c6f /drivers/scsi | |
parent | 7221d7e59d1c675828b6de50b757cd8282011a5d (diff) |
[SCSI] libfc: Fix frags in frame exceeding SKB_MAX_FRAGS in fc_fcp_send_data
In case of sequence offload, in fc_fcp_send_data(), the skb_fill_page_info()
called may end up adding more frags to the skb_shinfo(fp_skb(fp))->frags[],
exceeding SKB_MAX_FRAGS, this eventually corrupts the memory. I am adding the
FR_FRAME_SG_LEN back, but as SKB_MAX_FRAGS -1, leaving 1 for our fcoe_eof_crc
page. And send will be broken into multiple large sends if the frame already
contains more frags than skb handle.
Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libfc/fc_fcp.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c index 40ed7442d9df..28bfe1c2c50a 100644 --- a/drivers/scsi/libfc/fc_fcp.c +++ b/drivers/scsi/libfc/fc_fcp.c | |||
@@ -574,7 +574,8 @@ static int fc_fcp_send_data(struct fc_fcp_pkt *fsp, struct fc_seq *seq, | |||
574 | tlen -= sg_bytes; | 574 | tlen -= sg_bytes; |
575 | remaining -= sg_bytes; | 575 | remaining -= sg_bytes; |
576 | 576 | ||
577 | if (tlen) | 577 | if ((skb_shinfo(fp_skb(fp))->nr_frags < FC_FRAME_SG_LEN) && |
578 | (tlen)) | ||
578 | continue; | 579 | continue; |
579 | 580 | ||
580 | /* | 581 | /* |