summary refs log tree commit diff
path: root/drivers/firewire/fw-iso.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-02-06 14:49:40 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-09 22:02:55 +0100
commit82eff9db7dc5d8f78898d5051975d14f48be2028 (patch)
tree4f65c617d165f90cee98d84373452b160be23349 /drivers/firewire/fw-iso.c
parent27a15e50fb87978d7e1e9f7b561f78692e0b1eb5 (diff)
downloadlinux-82eff9db7dc5d8f78898d5051975d14f48be2028.tar.gz
firewire: Use dma_mapping_error() for checking for DMA mapping errors.
Pointed out by Pete Zaitcev.

Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-iso.c')
-rw-r--r--drivers/firewire/fw-iso.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c
index 024fab4ef998..6481e3df2c93 100644
--- a/drivers/firewire/fw-iso.c
+++ b/drivers/firewire/fw-iso.c
@@ -33,7 +33,7 @@ setup_iso_buffer(struct fw_iso_context *ctx, size_t size,
 		 enum dma_data_direction direction)
 {
 	struct page *page;
-	int i;
+	int i, j;
 	void *p;
 
 	ctx->buffer_size = PAGE_ALIGN(size);
@@ -42,24 +42,33 @@ setup_iso_buffer(struct fw_iso_context *ctx, size_t size,
 
 	ctx->buffer = vmalloc_32_user(ctx->buffer_size);
 	if (ctx->buffer == NULL)
-		return -ENOMEM;
+		goto fail_buffer_alloc;
 
 	ctx->page_count = ctx->buffer_size >> PAGE_SHIFT;
 	ctx->pages =
 	    kzalloc(ctx->page_count * sizeof(ctx->pages[0]), GFP_KERNEL);
-	if (ctx->pages == NULL) {
-		vfree(ctx->buffer);
-		return -ENOMEM;
-	}
+	if (ctx->pages == NULL)
+		goto fail_pages_alloc;
 
 	p = ctx->buffer;
 	for (i = 0; i < ctx->page_count; i++, p += PAGE_SIZE) {
 		page = vmalloc_to_page(p);
 		ctx->pages[i] = dma_map_page(ctx->card->device,
 					     page, 0, PAGE_SIZE, direction);
+		if (dma_mapping_error(ctx->pages[i]))
+			goto fail_mapping;
 	}
 
 	return 0;
+
+ fail_mapping:
+	for (j = 0; j < i; j++)
+		dma_unmap_page(ctx->card->device, ctx->pages[j],
+			       PAGE_SIZE, DMA_TO_DEVICE);
+ fail_pages_alloc:
+	vfree(ctx->buffer);
+ fail_buffer_alloc:
+	return -ENOMEM;
 }
 
 static void destroy_iso_buffer(struct fw_iso_context *ctx)