aboutsummaryrefslogtreecommitdiff
path: root/drivers/dma/iovlock.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2008-11-12 08:43:22 +1100
committerPaul Mackerras <paulus@samba.org>2008-11-12 08:43:22 +1100
commit486936cd93e99c802153b3f2f629c5ce62b8c0d4 (patch)
tree51e261a96e1fb6b51d4a6afb92bfc2480e150b6c /drivers/dma/iovlock.c
parent1c1b777a5673b57a6c0377ba60a790d05e4a0676 (diff)
parentf21f237cf55494c3a4209de323281a3b0528da10 (diff)
Merge branch 'linux-2.6' into next
Diffstat (limited to 'drivers/dma/iovlock.c')
-rw-r--r--drivers/dma/iovlock.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/dma/iovlock.c b/drivers/dma/iovlock.c
index e763d723e4c..9f6fe46a9b8 100644
--- a/drivers/dma/iovlock.c
+++ b/drivers/dma/iovlock.c
@@ -55,7 +55,6 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
int nr_iovecs = 0;
int iovec_len_used = 0;
int iovec_pages_used = 0;
- long err;
/* don't pin down non-user-based iovecs */
if (segment_eq(get_fs(), KERNEL_DS))
@@ -72,23 +71,21 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
local_list = kmalloc(sizeof(*local_list)
+ (nr_iovecs * sizeof (struct dma_page_list))
+ (iovec_pages_used * sizeof (struct page*)), GFP_KERNEL);
- if (!local_list) {
- err = -ENOMEM;
+ if (!local_list)
goto out;
- }
/* list of pages starts right after the page list array */
pages = (struct page **) &local_list->page_list[nr_iovecs];
+ local_list->nr_iovecs = 0;
+
for (i = 0; i < nr_iovecs; i++) {
struct dma_page_list *page_list = &local_list->page_list[i];
len -= iov[i].iov_len;
- if (!access_ok(VERIFY_WRITE, iov[i].iov_base, iov[i].iov_len)) {
- err = -EFAULT;
+ if (!access_ok(VERIFY_WRITE, iov[i].iov_base, iov[i].iov_len))
goto unpin;
- }
page_list->nr_pages = num_pages_spanned(&iov[i]);
page_list->base_address = iov[i].iov_base;
@@ -109,10 +106,8 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
NULL);
up_read(&current->mm->mmap_sem);
- if (ret != page_list->nr_pages) {
- err = -ENOMEM;
+ if (ret != page_list->nr_pages)
goto unpin;
- }
local_list->nr_iovecs = i + 1;
}
@@ -122,7 +117,7 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
unpin:
dma_unpin_iovec_pages(local_list);
out:
- return ERR_PTR(err);
+ return NULL;
}
void dma_unpin_iovec_pages(struct dma_pinned_list *pinned_list)