.. | .. |
---|
289 | 289 | |
---|
290 | 290 | /* |
---|
291 | 291 | * real segment loading function, called from segment_load |
---|
| 292 | + * Must return either an error code < 0, or the segment type code >= 0 |
---|
292 | 293 | */ |
---|
293 | 294 | static int |
---|
294 | 295 | __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long *end) |
---|
295 | 296 | { |
---|
296 | 297 | unsigned long start_addr, end_addr, dummy; |
---|
297 | 298 | struct dcss_segment *seg; |
---|
298 | | - int rc, diag_cc; |
---|
| 299 | + int rc, diag_cc, segtype; |
---|
299 | 300 | |
---|
300 | 301 | start_addr = end_addr = 0; |
---|
| 302 | + segtype = -1; |
---|
301 | 303 | seg = kmalloc(sizeof(*seg), GFP_KERNEL | GFP_DMA); |
---|
302 | 304 | if (seg == NULL) { |
---|
303 | 305 | rc = -ENOMEM; |
---|
.. | .. |
---|
326 | 328 | seg->res_name[8] = '\0'; |
---|
327 | 329 | strlcat(seg->res_name, " (DCSS)", sizeof(seg->res_name)); |
---|
328 | 330 | seg->res->name = seg->res_name; |
---|
329 | | - rc = seg->vm_segtype; |
---|
330 | | - if (rc == SEG_TYPE_SC || |
---|
331 | | - ((rc == SEG_TYPE_SR || rc == SEG_TYPE_ER) && !do_nonshared)) |
---|
| 331 | + segtype = seg->vm_segtype; |
---|
| 332 | + if (segtype == SEG_TYPE_SC || |
---|
| 333 | + ((segtype == SEG_TYPE_SR || segtype == SEG_TYPE_ER) && !do_nonshared)) |
---|
332 | 334 | seg->res->flags |= IORESOURCE_READONLY; |
---|
333 | 335 | |
---|
334 | 336 | /* Check for overlapping resources before adding the mapping. */ |
---|
.. | .. |
---|
386 | 388 | out_free: |
---|
387 | 389 | kfree(seg); |
---|
388 | 390 | out: |
---|
389 | | - return rc; |
---|
| 391 | + return rc < 0 ? rc : segtype; |
---|
390 | 392 | } |
---|
391 | 393 | |
---|
392 | 394 | /* |
---|