@@ -78,17 +78,15 @@ struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev, int npages)
78
78
return ibmr ;
79
79
80
80
out_no_cigar :
81
- if (ibmr ) {
82
- if (fmr -> fmr )
83
- ib_dealloc_fmr (fmr -> fmr );
84
- kfree (ibmr );
85
- }
81
+ kfree (ibmr );
86
82
atomic_dec (& pool -> item_count );
83
+
87
84
return ERR_PTR (err );
88
85
}
89
86
90
- int rds_ib_map_fmr (struct rds_ib_device * rds_ibdev , struct rds_ib_mr * ibmr ,
91
- struct scatterlist * sg , unsigned int nents )
87
+ static int rds_ib_map_fmr (struct rds_ib_device * rds_ibdev ,
88
+ struct rds_ib_mr * ibmr , struct scatterlist * sg ,
89
+ unsigned int nents )
92
90
{
93
91
struct ib_device * dev = rds_ibdev -> dev ;
94
92
struct rds_ib_fmr * fmr = & ibmr -> u .fmr ;
@@ -114,29 +112,39 @@ int rds_ib_map_fmr(struct rds_ib_device *rds_ibdev, struct rds_ib_mr *ibmr,
114
112
u64 dma_addr = ib_sg_dma_address (dev , & scat [i ]);
115
113
116
114
if (dma_addr & ~PAGE_MASK ) {
117
- if (i > 0 )
115
+ if (i > 0 ) {
116
+ ib_dma_unmap_sg (dev , sg , nents ,
117
+ DMA_BIDIRECTIONAL );
118
118
return - EINVAL ;
119
- else
119
+ } else {
120
120
++ page_cnt ;
121
+ }
121
122
}
122
123
if ((dma_addr + dma_len ) & ~PAGE_MASK ) {
123
- if (i < sg_dma_len - 1 )
124
+ if (i < sg_dma_len - 1 ) {
125
+ ib_dma_unmap_sg (dev , sg , nents ,
126
+ DMA_BIDIRECTIONAL );
124
127
return - EINVAL ;
125
- else
128
+ } else {
126
129
++ page_cnt ;
130
+ }
127
131
}
128
132
129
133
len += dma_len ;
130
134
}
131
135
132
136
page_cnt += len >> PAGE_SHIFT ;
133
- if (page_cnt > ibmr -> pool -> fmr_attr .max_pages )
137
+ if (page_cnt > ibmr -> pool -> fmr_attr .max_pages ) {
138
+ ib_dma_unmap_sg (dev , sg , nents , DMA_BIDIRECTIONAL );
134
139
return - EINVAL ;
140
+ }
135
141
136
142
dma_pages = kmalloc_node (sizeof (u64 ) * page_cnt , GFP_ATOMIC ,
137
143
rdsibdev_to_node (rds_ibdev ));
138
- if (!dma_pages )
144
+ if (!dma_pages ) {
145
+ ib_dma_unmap_sg (dev , sg , nents , DMA_BIDIRECTIONAL );
139
146
return - ENOMEM ;
147
+ }
140
148
141
149
page_cnt = 0 ;
142
150
for (i = 0 ; i < sg_dma_len ; ++ i ) {
@@ -149,8 +157,10 @@ int rds_ib_map_fmr(struct rds_ib_device *rds_ibdev, struct rds_ib_mr *ibmr,
149
157
}
150
158
151
159
ret = ib_map_phys_fmr (fmr -> fmr , dma_pages , page_cnt , io_addr );
152
- if (ret )
160
+ if (ret ) {
161
+ ib_dma_unmap_sg (dev , sg , nents , DMA_BIDIRECTIONAL );
153
162
goto out ;
163
+ }
154
164
155
165
/* Success - we successfully remapped the MR, so we can
156
166
* safely tear down the old mapping.
0 commit comments