diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/int_sqrt.c | 2 | ||||
-rw-r--r-- | lib/iomap_copy.c | 42 | ||||
-rw-r--r-- | lib/kobject.c | 9 | ||||
-rw-r--r-- | lib/kobject_uevent.c | 6 | ||||
-rw-r--r-- | lib/radix-tree.c | 10 | ||||
-rw-r--r-- | lib/spinlock_debug.c | 6 | ||||
-rw-r--r-- | lib/ts_bm.c | 40 |
8 files changed, 92 insertions, 25 deletions
diff --git a/lib/Makefile b/lib/Makefile index 8535f4d7d1c3..648b2c1242fd 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -9,7 +9,7 @@ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ | |||
9 | 9 | ||
10 | lib-y += kobject.o kref.o kobject_uevent.o klist.o | 10 | lib-y += kobject.o kref.o kobject_uevent.o klist.o |
11 | 11 | ||
12 | obj-y += sort.o parser.o halfmd4.o | 12 | obj-y += sort.o parser.o halfmd4.o iomap_copy.o |
13 | 13 | ||
14 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | 14 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) |
15 | CFLAGS_kobject.o += -DDEBUG | 15 | CFLAGS_kobject.o += -DDEBUG |
diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c index a5d2cdc5684c..fd355a99327c 100644 --- a/lib/int_sqrt.c +++ b/lib/int_sqrt.c | |||
@@ -15,7 +15,7 @@ unsigned long int_sqrt(unsigned long x) | |||
15 | op = x; | 15 | op = x; |
16 | res = 0; | 16 | res = 0; |
17 | 17 | ||
18 | one = 1 << 30; | 18 | one = 1UL << (BITS_PER_LONG - 2); |
19 | while (one > op) | 19 | while (one > op) |
20 | one >>= 2; | 20 | one >>= 2; |
21 | 21 | ||
diff --git a/lib/iomap_copy.c b/lib/iomap_copy.c new file mode 100644 index 000000000000..351045f4f63c --- /dev/null +++ b/lib/iomap_copy.c | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * Copyright 2006 PathScale, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This file is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of version 2 of the GNU General Public License | ||
6 | * as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software Foundation, | ||
15 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | /** | ||
22 | * __iowrite32_copy - copy data to MMIO space, in 32-bit units | ||
23 | * @to: destination, in MMIO space (must be 32-bit aligned) | ||
24 | * @from: source (must be 32-bit aligned) | ||
25 | * @count: number of 32-bit quantities to copy | ||
26 | * | ||
27 | * Copy data from kernel space to MMIO space, in units of 32 bits at a | ||
28 | * time. Order of access is not guaranteed, nor is a memory barrier | ||
29 | * performed afterwards. | ||
30 | */ | ||
31 | void __attribute__((weak)) __iowrite32_copy(void __iomem *to, | ||
32 | const void *from, | ||
33 | size_t count) | ||
34 | { | ||
35 | u32 __iomem *dst = to; | ||
36 | const u32 *src = from; | ||
37 | const u32 *end = src + count; | ||
38 | |||
39 | while (src < end) | ||
40 | __raw_writel(*src++, dst++); | ||
41 | } | ||
42 | EXPORT_SYMBOL_GPL(__iowrite32_copy); | ||
diff --git a/lib/kobject.c b/lib/kobject.c index 7a0e6809490d..efe67fa96a71 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -72,6 +72,8 @@ static int get_kobj_path_length(struct kobject *kobj) | |||
72 | * Add 1 to strlen for leading '/' of each level. | 72 | * Add 1 to strlen for leading '/' of each level. |
73 | */ | 73 | */ |
74 | do { | 74 | do { |
75 | if (kobject_name(parent) == NULL) | ||
76 | return 0; | ||
75 | length += strlen(kobject_name(parent)) + 1; | 77 | length += strlen(kobject_name(parent)) + 1; |
76 | parent = parent->parent; | 78 | parent = parent->parent; |
77 | } while (parent); | 79 | } while (parent); |
@@ -107,6 +109,8 @@ char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask) | |||
107 | int len; | 109 | int len; |
108 | 110 | ||
109 | len = get_kobj_path_length(kobj); | 111 | len = get_kobj_path_length(kobj); |
112 | if (len == 0) | ||
113 | return NULL; | ||
110 | path = kmalloc(len, gfp_mask); | 114 | path = kmalloc(len, gfp_mask); |
111 | if (!path) | 115 | if (!path) |
112 | return NULL; | 116 | return NULL; |
@@ -162,6 +166,11 @@ int kobject_add(struct kobject * kobj) | |||
162 | return -ENOENT; | 166 | return -ENOENT; |
163 | if (!kobj->k_name) | 167 | if (!kobj->k_name) |
164 | kobj->k_name = kobj->name; | 168 | kobj->k_name = kobj->name; |
169 | if (!kobj->k_name) { | ||
170 | pr_debug("kobject attempted to be registered with no name!\n"); | ||
171 | WARN_ON(1); | ||
172 | return -EINVAL; | ||
173 | } | ||
165 | parent = kobject_get(kobj->parent); | 174 | parent = kobject_get(kobj->parent); |
166 | 175 | ||
167 | pr_debug("kobject %s: registering. parent: %s, set: %s\n", | 176 | pr_debug("kobject %s: registering. parent: %s, set: %s\n", |
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index f56e27ae9d52..086a0c6e888e 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/kobject.h> | 22 | #include <linux/kobject.h> |
23 | #include <net/sock.h> | 23 | #include <net/sock.h> |
24 | 24 | ||
25 | #define BUFFER_SIZE 1024 /* buffer for the variables */ | 25 | #define BUFFER_SIZE 2048 /* buffer for the variables */ |
26 | #define NUM_ENVP 32 /* number of env pointers */ | 26 | #define NUM_ENVP 32 /* number of env pointers */ |
27 | 27 | ||
28 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) | 28 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) |
@@ -38,6 +38,10 @@ static char *action_to_string(enum kobject_action action) | |||
38 | return "remove"; | 38 | return "remove"; |
39 | case KOBJ_CHANGE: | 39 | case KOBJ_CHANGE: |
40 | return "change"; | 40 | return "change"; |
41 | case KOBJ_MOUNT: | ||
42 | return "mount"; | ||
43 | case KOBJ_UMOUNT: | ||
44 | return "umount"; | ||
41 | case KOBJ_OFFLINE: | 45 | case KOBJ_OFFLINE: |
42 | return "offline"; | 46 | return "offline"; |
43 | case KOBJ_ONLINE: | 47 | case KOBJ_ONLINE: |
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index c0bd4a914803..1e5b17dc7e3d 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
@@ -752,12 +752,14 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) | |||
752 | */ | 752 | */ |
753 | nr_cleared_tags = 0; | 753 | nr_cleared_tags = 0; |
754 | for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { | 754 | for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { |
755 | tags[tag] = 1; | ||
755 | if (tag_get(pathp->node, tag, pathp->offset)) { | 756 | if (tag_get(pathp->node, tag, pathp->offset)) { |
756 | tag_clear(pathp->node, tag, pathp->offset); | 757 | tag_clear(pathp->node, tag, pathp->offset); |
757 | tags[tag] = 0; | 758 | if (!any_tag_set(pathp->node, tag)) { |
758 | nr_cleared_tags++; | 759 | tags[tag] = 0; |
759 | } else | 760 | nr_cleared_tags++; |
760 | tags[tag] = 1; | 761 | } |
762 | } | ||
761 | } | 763 | } |
762 | 764 | ||
763 | for (pathp--; nr_cleared_tags && pathp->node; pathp--) { | 765 | for (pathp--; nr_cleared_tags && pathp->node; pathp--) { |
diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c index c8bb8cc899d7..d8b6bb419d49 100644 --- a/lib/spinlock_debug.c +++ b/lib/spinlock_debug.c | |||
@@ -72,9 +72,9 @@ static void __spin_lock_debug(spinlock_t *lock) | |||
72 | 72 | ||
73 | for (;;) { | 73 | for (;;) { |
74 | for (i = 0; i < loops_per_jiffy * HZ; i++) { | 74 | for (i = 0; i < loops_per_jiffy * HZ; i++) { |
75 | cpu_relax(); | ||
76 | if (__raw_spin_trylock(&lock->raw_lock)) | 75 | if (__raw_spin_trylock(&lock->raw_lock)) |
77 | return; | 76 | return; |
77 | __delay(1); | ||
78 | } | 78 | } |
79 | /* lockup suspected: */ | 79 | /* lockup suspected: */ |
80 | if (print_once) { | 80 | if (print_once) { |
@@ -144,9 +144,9 @@ static void __read_lock_debug(rwlock_t *lock) | |||
144 | 144 | ||
145 | for (;;) { | 145 | for (;;) { |
146 | for (i = 0; i < loops_per_jiffy * HZ; i++) { | 146 | for (i = 0; i < loops_per_jiffy * HZ; i++) { |
147 | cpu_relax(); | ||
148 | if (__raw_read_trylock(&lock->raw_lock)) | 147 | if (__raw_read_trylock(&lock->raw_lock)) |
149 | return; | 148 | return; |
149 | __delay(1); | ||
150 | } | 150 | } |
151 | /* lockup suspected: */ | 151 | /* lockup suspected: */ |
152 | if (print_once) { | 152 | if (print_once) { |
@@ -217,9 +217,9 @@ static void __write_lock_debug(rwlock_t *lock) | |||
217 | 217 | ||
218 | for (;;) { | 218 | for (;;) { |
219 | for (i = 0; i < loops_per_jiffy * HZ; i++) { | 219 | for (i = 0; i < loops_per_jiffy * HZ; i++) { |
220 | cpu_relax(); | ||
221 | if (__raw_write_trylock(&lock->raw_lock)) | 220 | if (__raw_write_trylock(&lock->raw_lock)) |
222 | return; | 221 | return; |
222 | __delay(1); | ||
223 | } | 223 | } |
224 | /* lockup suspected: */ | 224 | /* lockup suspected: */ |
225 | if (print_once) { | 225 | if (print_once) { |
diff --git a/lib/ts_bm.c b/lib/ts_bm.c index 8a8b3a16133e..c4c1ac5fbd1a 100644 --- a/lib/ts_bm.c +++ b/lib/ts_bm.c | |||
@@ -94,10 +94,28 @@ next: bs = bm->bad_shift[text[shift-i]]; | |||
94 | return UINT_MAX; | 94 | return UINT_MAX; |
95 | } | 95 | } |
96 | 96 | ||
97 | static int subpattern(u8 *pattern, int i, int j, int g) | ||
98 | { | ||
99 | int x = i+g-1, y = j+g-1, ret = 0; | ||
100 | |||
101 | while(pattern[x--] == pattern[y--]) { | ||
102 | if (y < 0) { | ||
103 | ret = 1; | ||
104 | break; | ||
105 | } | ||
106 | if (--g == 0) { | ||
107 | ret = pattern[i-1] != pattern[j-1]; | ||
108 | break; | ||
109 | } | ||
110 | } | ||
111 | |||
112 | return ret; | ||
113 | } | ||
114 | |||
97 | static void compute_prefix_tbl(struct ts_bm *bm, const u8 *pattern, | 115 | static void compute_prefix_tbl(struct ts_bm *bm, const u8 *pattern, |
98 | unsigned int len) | 116 | unsigned int len) |
99 | { | 117 | { |
100 | int i, j, ended, l[ASIZE]; | 118 | int i, j, g; |
101 | 119 | ||
102 | for (i = 0; i < ASIZE; i++) | 120 | for (i = 0; i < ASIZE; i++) |
103 | bm->bad_shift[i] = len; | 121 | bm->bad_shift[i] = len; |
@@ -106,23 +124,15 @@ static void compute_prefix_tbl(struct ts_bm *bm, const u8 *pattern, | |||
106 | 124 | ||
107 | /* Compute the good shift array, used to match reocurrences | 125 | /* Compute the good shift array, used to match reocurrences |
108 | * of a subpattern */ | 126 | * of a subpattern */ |
109 | for (i = 1; i < bm->patlen; i++) { | ||
110 | for (j = 0; j < bm->patlen && bm->pattern[bm->patlen - 1 - j] | ||
111 | == bm->pattern[bm->patlen - 1 - i - j]; j++); | ||
112 | l[i] = j; | ||
113 | } | ||
114 | |||
115 | bm->good_shift[0] = 1; | 127 | bm->good_shift[0] = 1; |
116 | for (i = 1; i < bm->patlen; i++) | 128 | for (i = 1; i < bm->patlen; i++) |
117 | bm->good_shift[i] = bm->patlen; | 129 | bm->good_shift[i] = bm->patlen; |
118 | for (i = bm->patlen - 1; i > 0; i--) | 130 | for (i = bm->patlen-1, g = 1; i > 0; g++, i--) { |
119 | bm->good_shift[l[i]] = i; | 131 | for (j = i-1; j >= 1-g ; j--) |
120 | ended = 0; | 132 | if (subpattern(bm->pattern, i, j, g)) { |
121 | for (i = 0; i < bm->patlen; i++) { | 133 | bm->good_shift[g] = bm->patlen-j-g; |
122 | if (l[i] == bm->patlen - 1 - i) | 134 | break; |
123 | ended = i; | 135 | } |
124 | if (ended) | ||
125 | bm->good_shift[i] = ended; | ||
126 | } | 136 | } |
127 | } | 137 | } |
128 | 138 | ||