| .. | .. |
|---|
| 535 | 535 | |
|---|
| 536 | 536 | ret = device->ops.create_ah(ah, &init_attr, udata); |
|---|
| 537 | 537 | if (ret) { |
|---|
| 538 | + if (ah->sgid_attr) |
|---|
| 539 | + rdma_put_gid_attr(ah->sgid_attr); |
|---|
| 538 | 540 | kfree(ah); |
|---|
| 539 | 541 | return ERR_PTR(ret); |
|---|
| 540 | 542 | } |
|---|
| .. | .. |
|---|
| 2911 | 2913 | bool __rdma_block_iter_next(struct ib_block_iter *biter) |
|---|
| 2912 | 2914 | { |
|---|
| 2913 | 2915 | unsigned int block_offset; |
|---|
| 2916 | + unsigned int sg_delta; |
|---|
| 2914 | 2917 | |
|---|
| 2915 | 2918 | if (!biter->__sg_nents || !biter->__sg) |
|---|
| 2916 | 2919 | return false; |
|---|
| 2917 | 2920 | |
|---|
| 2918 | 2921 | biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance; |
|---|
| 2919 | 2922 | block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1); |
|---|
| 2920 | | - biter->__sg_advance += BIT_ULL(biter->__pg_bit) - block_offset; |
|---|
| 2923 | + sg_delta = BIT_ULL(biter->__pg_bit) - block_offset; |
|---|
| 2921 | 2924 | |
|---|
| 2922 | | - if (biter->__sg_advance >= sg_dma_len(biter->__sg)) { |
|---|
| 2925 | + if (sg_dma_len(biter->__sg) - biter->__sg_advance > sg_delta) { |
|---|
| 2926 | + biter->__sg_advance += sg_delta; |
|---|
| 2927 | + } else { |
|---|
| 2923 | 2928 | biter->__sg_advance = 0; |
|---|
| 2924 | 2929 | biter->__sg = sg_next(biter->__sg); |
|---|
| 2925 | 2930 | biter->__sg_nents--; |
|---|