[openib-general] [PATCH] RFC: srp filesystem data corruption problem/work-around

Snider, Tim Tim.Snider at engenio.com
Wed Aug 2 09:50:09 PDT 2006


You may (or may not) want to include the LSI OUI (0x00,0xa0,0xb8) for
future compatability. This change will be available in the storage
firmware around Sept. 2006. It might save some future mod.

Timothy Snider 
Storage Architect
Strategic Planning, Technology and Architecture
LSI Logic Corporation
3718 North Rock Road
Wichita, KS 67226
(316) 636-8736 
tim.snider at lsil.com 


-----Original Message-----
From: Michael S. Tsirkin [mailto:mst at mellanox.co.il] 
Sent: Wednesday, August 02, 2006 11:44 AM
To: Vu Pham
Cc: Roland Dreier; Snider, Tim; openib-general at openib.org
Subject: Re: [PATCH] RFC: srp filesystem data corruption
problem/work-around

Quoting r. Vu Pham <vuhuong at mellanox.com>:
> Subject: Re: [PATCH] RFC: srp filesystem data corruption 
> problem/work-around
> 
> Michael,
> 
> > +static const u8 mellanox_oui[3] = { 0x02, 0xc9, 0x02 };
> 
> Should it be {0x00, 0x02, 0xc9}?

Ugh. Of course it should. Like this:

--

Add work-around for data corruption observed with Mellanox targets when
VA != 0.

Signed-off-by: Ishai Rabinovitz <ishai at mellanox.co.il>
Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>

diff --git a/drivers/infiniband/ulp/srp/ib_srp.c
b/drivers/infiniband/ulp/srp/ib_srp.c
index 8f472e7..6a8b286 100644
Index: last_stable/drivers/infiniband/ulp/srp/ib_srp.c
===================================================================
--- last_stable.orig/drivers/infiniband/ulp/srp/ib_srp.c
2006-07-31 16:52:26.000000000 +0300
+++ last_stable/drivers/infiniband/ulp/srp/ib_srp.c	2006-07-31
18:37:58.000000000 +0300
@@ -77,6 +77,14 @@ MODULE_PARM_DESC(topspin_workarounds,
 
 static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
 
+static int mellanox_workarounds = 1;
+
+module_param(mellanox_workarounds, int, 0444); 
+MODULE_PARM_DESC(mellanox_workarounds,
+		 "Enable workarounds for Mellanox SRP target bugs if !=
0");
+
+static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
+
 static void srp_add_one(struct ib_device *device);  static void
srp_remove_one(struct ib_device *device);  static void
srp_completion(struct ib_cq *cq, void *target_ptr); @@ -569,7 +577,7 @@
err:
 	return ret;
 }
 
-static int srp_map_fmr(struct srp_device *dev, struct scatterlist
*scat,
+static int srp_map_fmr(struct srp_target_port *target, struct 
+scatterlist *scat,
 		       int sg_cnt, struct srp_request *req,
 		       struct srp_direct_buf *buf)
 {
@@ -579,10 +587,15 @@ static int srp_map_fmr(struct srp_device
 	int page_cnt;
 	int i, j;
 	int ret;
+	struct srp_device *dev = target->srp_host->dev;
 
 	if (!dev->fmr_pool)
 		return -ENODEV;
 
+	if ((sg_dma_address(&scat[0]) & ~dev->fmr_page_mask) &&
+	    mellanox_workarounds && !memcmp(&target->ioc_guid,
mellanox_oui, 3))
+		return -EINVAL;
+
 	len = page_cnt = 0;
 	for (i = 0; i < sg_cnt; ++i) {
 		if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) { @@
-685,7 +699,7 @@ static int srp_map_data(struct scsi_cmnd
 		buf->va  = cpu_to_be64(sg_dma_address(scat));
 		buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey);
 		buf->len = cpu_to_be32(sg_dma_len(scat));
-	} else if (srp_map_fmr(target->srp_host->dev, scat, count, req,
+	} else if (srp_map_fmr(target, scat, count, req,
 			       (void *) cmd->add_data)) {
 		/*
 		 * FMR mapping failed, and the scatterlist has more
--
MST




More information about the general mailing list