aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-10-27 05:50:54 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-27 05:50:54 -0400
commit4944dd62de21230af039eda7cd218e9a09021d11 (patch)
treebac70f7bab8506c7e1b0408bacbdb0b1d77262e9 /lib
parentf17845e5d97ead8fbdadfd40039e058ec7cf4a42 (diff)
parent0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (diff)
Merge commit 'v2.6.28-rc2' into tracing/urgent
Diffstat (limited to 'lib')
-rw-r--r--lib/bitmap.c22
-rw-r--r--lib/string_helpers.c34
2 files changed, 41 insertions, 15 deletions
diff --git a/lib/bitmap.c b/lib/bitmap.c
index 482df94ea21e..1338469ac849 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -996,3 +996,25 @@ int bitmap_allocate_region(unsigned long *bitmap, int pos, int order)
996 return 0; 996 return 0;
997} 997}
998EXPORT_SYMBOL(bitmap_allocate_region); 998EXPORT_SYMBOL(bitmap_allocate_region);
999
1000/**
1001 * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order.
1002 * @dst: destination buffer
1003 * @src: bitmap to copy
1004 * @nbits: number of bits in the bitmap
1005 *
1006 * Require nbits % BITS_PER_LONG == 0.
1007 */
1008void bitmap_copy_le(void *dst, const unsigned long *src, int nbits)
1009{
1010 unsigned long *d = dst;
1011 int i;
1012
1013 for (i = 0; i < nbits/BITS_PER_LONG; i++) {
1014 if (BITS_PER_LONG == 64)
1015 d[i] = cpu_to_le64(src[i]);
1016 else
1017 d[i] = cpu_to_le32(src[i]);
1018 }
1019}
1020EXPORT_SYMBOL(bitmap_copy_le);
diff --git a/lib/string_helpers.c b/lib/string_helpers.c
index 8347925030ff..ab431d4cc970 100644
--- a/lib/string_helpers.c
+++ b/lib/string_helpers.c
@@ -23,7 +23,7 @@
23int string_get_size(u64 size, const enum string_size_units units, 23int string_get_size(u64 size, const enum string_size_units units,
24 char *buf, int len) 24 char *buf, int len)
25{ 25{
26 const char *units_10[] = { "B", "KB", "MB", "GB", "TB", "PB", 26 const char *units_10[] = { "B", "kB", "MB", "GB", "TB", "PB",
27 "EB", "ZB", "YB", NULL}; 27 "EB", "ZB", "YB", NULL};
28 const char *units_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB", 28 const char *units_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB",
29 "EiB", "ZiB", "YiB", NULL }; 29 "EiB", "ZiB", "YiB", NULL };
@@ -31,7 +31,7 @@ int string_get_size(u64 size, const enum string_size_units units,
31 [STRING_UNITS_10] = units_10, 31 [STRING_UNITS_10] = units_10,
32 [STRING_UNITS_2] = units_2, 32 [STRING_UNITS_2] = units_2,
33 }; 33 };
34 const int divisor[] = { 34 const unsigned int divisor[] = {
35 [STRING_UNITS_10] = 1000, 35 [STRING_UNITS_10] = 1000,
36 [STRING_UNITS_2] = 1024, 36 [STRING_UNITS_2] = 1024,
37 }; 37 };
@@ -40,23 +40,27 @@ int string_get_size(u64 size, const enum string_size_units units,
40 char tmp[8]; 40 char tmp[8];
41 41
42 tmp[0] = '\0'; 42 tmp[0] = '\0';
43 i = 0;
44 if (size >= divisor[units]) {
45 while (size >= divisor[units] && units_str[units][i]) {
46 remainder = do_div(size, divisor[units]);
47 i++;
48 }
43 49
44 for (i = 0; size > divisor[units] && units_str[units][i]; i++) 50 sf_cap = size;
45 remainder = do_div(size, divisor[units]); 51 for (j = 0; sf_cap*10 < 1000; j++)
52 sf_cap *= 10;
46 53
47 sf_cap = size; 54 if (j) {
48 for (j = 0; sf_cap*10 < 1000; j++) 55 remainder *= 1000;
49 sf_cap *= 10; 56 do_div(remainder, divisor[units]);
50 57 snprintf(tmp, sizeof(tmp), ".%03lld",
51 if (j) { 58 (unsigned long long)remainder);
52 remainder *= 1000; 59 tmp[j+1] = '\0';
53 do_div(remainder, divisor[units]); 60 }
54 snprintf(tmp, sizeof(tmp), ".%03lld",
55 (unsigned long long)remainder);
56 tmp[j+1] = '\0';
57 } 61 }
58 62
59 snprintf(buf, len, "%lld%s%s", (unsigned long long)size, 63 snprintf(buf, len, "%lld%s %s", (unsigned long long)size,
60 tmp, units_str[units][i]); 64 tmp, units_str[units][i]);
61 65
62 return 0; 66 return 0;