.. | .. |
---|
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--; |
---|