diff options
Diffstat (limited to 'drivers/infiniband/core/cache.c')
-rw-r--r-- | drivers/infiniband/core/cache.c | 10 |
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); |