aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/core/cache.c')
-rw-r--r--drivers/infiniband/core/cache.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index c2e257d97eff..040966775f40 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -178,6 +178,7 @@ static int write_gid(struct ib_device *ib_dev, u8 port,
178{ 178{
179 int ret = 0; 179 int ret = 0;
180 struct net_device *old_net_dev; 180 struct net_device *old_net_dev;
181 enum ib_gid_type old_gid_type;
181 182
182 /* in rdma_cap_roce_gid_table, this funciton should be protected by a 183 /* in rdma_cap_roce_gid_table, this funciton should be protected by a
183 * sleep-able lock. 184 * sleep-able lock.
@@ -199,6 +200,7 @@ static int write_gid(struct ib_device *ib_dev, u8 port,
199 } 200 }
200 201
201 old_net_dev = table->data_vec[ix].attr.ndev; 202 old_net_dev = table->data_vec[ix].attr.ndev;
203 old_gid_type = table->data_vec[ix].attr.gid_type;
202 if (old_net_dev && old_net_dev != attr->ndev) 204 if (old_net_dev && old_net_dev != attr->ndev)
203 dev_put(old_net_dev); 205 dev_put(old_net_dev);
204 /* if modify_gid failed, just delete the old gid */ 206 /* if modify_gid failed, just delete the old gid */
@@ -207,10 +209,14 @@ static int write_gid(struct ib_device *ib_dev, u8 port,
207 attr = &zattr; 209 attr = &zattr;
208 table->data_vec[ix].context = NULL; 210 table->data_vec[ix].context = NULL;
209 } 211 }
210 if (default_gid) 212
211 table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT;
212 memcpy(&table->data_vec[ix].gid, gid, sizeof(*gid)); 213 memcpy(&table->data_vec[ix].gid, gid, sizeof(*gid));
213 memcpy(&table->data_vec[ix].attr, attr, sizeof(*attr)); 214 memcpy(&table->data_vec[ix].attr, attr, sizeof(*attr));
215 if (default_gid) {
216 table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT;
217 if (action == GID_TABLE_WRITE_ACTION_DEL)
218 table->data_vec[ix].attr.gid_type = old_gid_type;
219 }
214 if (table->data_vec[ix].attr.ndev && 220 if (table->data_vec[ix].attr.ndev &&
215 table->data_vec[ix].attr.ndev != old_net_dev) 221 table->data_vec[ix].attr.ndev != old_net_dev)
216 dev_hold(table->data_vec[ix].attr.ndev); 222 dev_hold(table->data_vec[ix].attr.ndev);