diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Makefile | 2 | ||||
| -rw-r--r-- | lib/iovec.c | 53 | ||||
| -rw-r--r-- | lib/klist.c | 2 | ||||
| -rw-r--r-- | lib/mpi/longlong.h | 5 |
4 files changed, 58 insertions, 4 deletions
diff --git a/lib/Makefile b/lib/Makefile index e9c52e1b853a..c55a037a354e 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -23,7 +23,7 @@ lib-y += kobject.o klist.o | |||
| 23 | 23 | ||
| 24 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | 24 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
| 25 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ | 25 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ |
| 26 | gcd.o lcm.o list_sort.o uuid.o flex_array.o \ | 26 | gcd.o lcm.o list_sort.o uuid.o flex_array.o iovec.o \ |
| 27 | bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o | 27 | bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o |
| 28 | obj-y += string_helpers.o | 28 | obj-y += string_helpers.o |
| 29 | obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o | 29 | obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o |
diff --git a/lib/iovec.c b/lib/iovec.c new file mode 100644 index 000000000000..454baa88bf27 --- /dev/null +++ b/lib/iovec.c | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | #include <linux/uaccess.h> | ||
| 2 | #include <linux/export.h> | ||
| 3 | #include <linux/uio.h> | ||
| 4 | |||
| 5 | /* | ||
| 6 | * Copy iovec to kernel. Returns -EFAULT on error. | ||
| 7 | * | ||
| 8 | * Note: this modifies the original iovec. | ||
| 9 | */ | ||
| 10 | |||
| 11 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len) | ||
| 12 | { | ||
| 13 | while (len > 0) { | ||
| 14 | if (iov->iov_len) { | ||
| 15 | int copy = min_t(unsigned int, len, iov->iov_len); | ||
| 16 | if (copy_from_user(kdata, iov->iov_base, copy)) | ||
| 17 | return -EFAULT; | ||
| 18 | len -= copy; | ||
| 19 | kdata += copy; | ||
| 20 | iov->iov_base += copy; | ||
| 21 | iov->iov_len -= copy; | ||
| 22 | } | ||
| 23 | iov++; | ||
| 24 | } | ||
| 25 | |||
| 26 | return 0; | ||
| 27 | } | ||
| 28 | EXPORT_SYMBOL(memcpy_fromiovec); | ||
| 29 | |||
| 30 | /* | ||
| 31 | * Copy kernel to iovec. Returns -EFAULT on error. | ||
| 32 | * | ||
| 33 | * Note: this modifies the original iovec. | ||
| 34 | */ | ||
| 35 | |||
| 36 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len) | ||
| 37 | { | ||
| 38 | while (len > 0) { | ||
| 39 | if (iov->iov_len) { | ||
| 40 | int copy = min_t(unsigned int, iov->iov_len, len); | ||
| 41 | if (copy_to_user(iov->iov_base, kdata, copy)) | ||
| 42 | return -EFAULT; | ||
| 43 | kdata += copy; | ||
| 44 | len -= copy; | ||
| 45 | iov->iov_len -= copy; | ||
| 46 | iov->iov_base += copy; | ||
| 47 | } | ||
| 48 | iov++; | ||
| 49 | } | ||
| 50 | |||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | EXPORT_SYMBOL(memcpy_toiovec); | ||
diff --git a/lib/klist.c b/lib/klist.c index 0874e41609a6..358a368a2947 100644 --- a/lib/klist.c +++ b/lib/klist.c | |||
| @@ -193,10 +193,10 @@ static void klist_release(struct kref *kref) | |||
| 193 | if (waiter->node != n) | 193 | if (waiter->node != n) |
| 194 | continue; | 194 | continue; |
| 195 | 195 | ||
| 196 | list_del(&waiter->list); | ||
| 196 | waiter->woken = 1; | 197 | waiter->woken = 1; |
| 197 | mb(); | 198 | mb(); |
| 198 | wake_up_process(waiter->process); | 199 | wake_up_process(waiter->process); |
| 199 | list_del(&waiter->list); | ||
| 200 | } | 200 | } |
| 201 | spin_unlock(&klist_remove_lock); | 201 | spin_unlock(&klist_remove_lock); |
| 202 | knode_set_klist(n, NULL); | 202 | knode_set_klist(n, NULL); |
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index 095ab157a521..d411355f238e 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
| @@ -318,7 +318,8 @@ extern UDItype __udiv_qrnnd(); | |||
| 318 | "rM" ((USItype)(bh)), \ | 318 | "rM" ((USItype)(bh)), \ |
| 319 | "rM" ((USItype)(al)), \ | 319 | "rM" ((USItype)(al)), \ |
| 320 | "rM" ((USItype)(bl))) | 320 | "rM" ((USItype)(bl))) |
| 321 | #if defined(_PA_RISC1_1) | 321 | #if 0 && defined(_PA_RISC1_1) |
| 322 | /* xmpyu uses floating point register which is not allowed in Linux kernel. */ | ||
| 322 | #define umul_ppmm(wh, wl, u, v) \ | 323 | #define umul_ppmm(wh, wl, u, v) \ |
| 323 | do { \ | 324 | do { \ |
| 324 | union {UDItype __ll; \ | 325 | union {UDItype __ll; \ |
| @@ -337,7 +338,7 @@ do { \ | |||
| 337 | #define UMUL_TIME 40 | 338 | #define UMUL_TIME 40 |
| 338 | #define UDIV_TIME 80 | 339 | #define UDIV_TIME 80 |
| 339 | #endif | 340 | #endif |
| 340 | #ifndef LONGLONG_STANDALONE | 341 | #if 0 /* #ifndef LONGLONG_STANDALONE */ |
| 341 | #define udiv_qrnnd(q, r, n1, n0, d) \ | 342 | #define udiv_qrnnd(q, r, n1, n0, d) \ |
| 342 | do { USItype __r; \ | 343 | do { USItype __r; \ |
| 343 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ | 344 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ |
