xref: /openbmc/linux/drivers/md/bcache/util.c (revision 9276717b)
1cafe5635SKent Overstreet /*
2cafe5635SKent Overstreet  * random utiility code, for bcache but in theory not specific to bcache
3cafe5635SKent Overstreet  *
4cafe5635SKent Overstreet  * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
5cafe5635SKent Overstreet  * Copyright 2012 Google, Inc.
6cafe5635SKent Overstreet  */
7cafe5635SKent Overstreet 
8cafe5635SKent Overstreet #include <linux/bio.h>
9cafe5635SKent Overstreet #include <linux/blkdev.h>
10cafe5635SKent Overstreet #include <linux/ctype.h>
11cafe5635SKent Overstreet #include <linux/debugfs.h>
12cafe5635SKent Overstreet #include <linux/module.h>
13cafe5635SKent Overstreet #include <linux/seq_file.h>
14cafe5635SKent Overstreet #include <linux/types.h>
15e6017571SIngo Molnar #include <linux/sched/clock.h>
16cafe5635SKent Overstreet 
17cafe5635SKent Overstreet #include "util.h"
18cafe5635SKent Overstreet 
19cafe5635SKent Overstreet #define simple_strtoint(c, end, base)	simple_strtol(c, end, base)
20cafe5635SKent Overstreet #define simple_strtouint(c, end, base)	simple_strtoul(c, end, base)
21cafe5635SKent Overstreet 
22cafe5635SKent Overstreet #define STRTO_H(name, type)					\
23169ef1cfSKent Overstreet int bch_ ## name ## _h(const char *cp, type *res)		\
24cafe5635SKent Overstreet {								\
25cafe5635SKent Overstreet 	int u = 0;						\
26cafe5635SKent Overstreet 	char *e;						\
27cafe5635SKent Overstreet 	type i = simple_ ## name(cp, &e, 10);			\
28cafe5635SKent Overstreet 								\
29cafe5635SKent Overstreet 	switch (tolower(*e)) {					\
30cafe5635SKent Overstreet 	default:						\
31cafe5635SKent Overstreet 		return -EINVAL;					\
32cafe5635SKent Overstreet 	case 'y':						\
33cafe5635SKent Overstreet 	case 'z':						\
34cafe5635SKent Overstreet 		u++;						\
35cafe5635SKent Overstreet 	case 'e':						\
36cafe5635SKent Overstreet 		u++;						\
37cafe5635SKent Overstreet 	case 'p':						\
38cafe5635SKent Overstreet 		u++;						\
39cafe5635SKent Overstreet 	case 't':						\
40cafe5635SKent Overstreet 		u++;						\
41cafe5635SKent Overstreet 	case 'g':						\
42cafe5635SKent Overstreet 		u++;						\
43cafe5635SKent Overstreet 	case 'm':						\
44cafe5635SKent Overstreet 		u++;						\
45cafe5635SKent Overstreet 	case 'k':						\
46cafe5635SKent Overstreet 		u++;						\
47cafe5635SKent Overstreet 		if (e++ == cp)					\
48cafe5635SKent Overstreet 			return -EINVAL;				\
49cafe5635SKent Overstreet 	case '\n':						\
50cafe5635SKent Overstreet 	case '\0':						\
51cafe5635SKent Overstreet 		if (*e == '\n')					\
52cafe5635SKent Overstreet 			e++;					\
53cafe5635SKent Overstreet 	}							\
54cafe5635SKent Overstreet 								\
55cafe5635SKent Overstreet 	if (*e)							\
56cafe5635SKent Overstreet 		return -EINVAL;					\
57cafe5635SKent Overstreet 								\
58cafe5635SKent Overstreet 	while (u--) {						\
59cafe5635SKent Overstreet 		if ((type) ~0 > 0 &&				\
60cafe5635SKent Overstreet 		    (type) ~0 / 1024 <= i)			\
61cafe5635SKent Overstreet 			return -EINVAL;				\
62cafe5635SKent Overstreet 		if ((i > 0 && ANYSINT_MAX(type) / 1024 < i) ||	\
63cafe5635SKent Overstreet 		    (i < 0 && -ANYSINT_MAX(type) / 1024 > i))	\
64cafe5635SKent Overstreet 			return -EINVAL;				\
65cafe5635SKent Overstreet 		i *= 1024;					\
66cafe5635SKent Overstreet 	}							\
67cafe5635SKent Overstreet 								\
68cafe5635SKent Overstreet 	*res = i;						\
69cafe5635SKent Overstreet 	return 0;						\
70cafe5635SKent Overstreet }								\
71cafe5635SKent Overstreet 
72cafe5635SKent Overstreet STRTO_H(strtoint, int)
73cafe5635SKent Overstreet STRTO_H(strtouint, unsigned int)
74cafe5635SKent Overstreet STRTO_H(strtoll, long long)
75cafe5635SKent Overstreet STRTO_H(strtoull, unsigned long long)
76cafe5635SKent Overstreet 
779276717bSMichael Lyle /**
789276717bSMichael Lyle  * bch_hprint() - formats @v to human readable string for sysfs.
799276717bSMichael Lyle  *
809276717bSMichael Lyle  * @v - signed 64 bit integer
819276717bSMichael Lyle  * @buf - the (at least 8 byte) buffer to format the result into.
829276717bSMichael Lyle  *
839276717bSMichael Lyle  * Returns the number of bytes used by format.
849276717bSMichael Lyle  */
85169ef1cfSKent Overstreet ssize_t bch_hprint(char *buf, int64_t v)
86cafe5635SKent Overstreet {
87cafe5635SKent Overstreet 	static const char units[] = "?kMGTPEZY";
889276717bSMichael Lyle 	int u = 0, t;
89cafe5635SKent Overstreet 
909276717bSMichael Lyle 	uint64_t q;
91cafe5635SKent Overstreet 
929276717bSMichael Lyle 	if (v < 0)
939276717bSMichael Lyle 		q = -v;
949276717bSMichael Lyle 	else
959276717bSMichael Lyle 		q = v;
96cafe5635SKent Overstreet 
979276717bSMichael Lyle 	/* For as long as the number is more than 3 digits, but at least
989276717bSMichael Lyle 	 * once, shift right / divide by 1024.  Keep the remainder for
999276717bSMichael Lyle 	 * a digit after the decimal point.
1009276717bSMichael Lyle 	 */
1019276717bSMichael Lyle 	do {
1029276717bSMichael Lyle 		u++;
103cafe5635SKent Overstreet 
1049276717bSMichael Lyle 		t = q & ~(~0 << 10);
1059276717bSMichael Lyle 		q >>= 10;
1069276717bSMichael Lyle 	} while (q >= 1000);
1079276717bSMichael Lyle 
1089276717bSMichael Lyle 	if (v < 0)
1099276717bSMichael Lyle 		/* '-', up to 3 digits, '.', 1 digit, 1 character, null;
1109276717bSMichael Lyle 		 * yields 8 bytes.
1119276717bSMichael Lyle 		 */
1129276717bSMichael Lyle 		return sprintf(buf, "-%llu.%i%c", q, t * 10 / 1024, units[u]);
1139276717bSMichael Lyle 	else
1149276717bSMichael Lyle 		return sprintf(buf, "%llu.%i%c", q, t * 10 / 1024, units[u]);
115cafe5635SKent Overstreet }
116cafe5635SKent Overstreet 
117169ef1cfSKent Overstreet ssize_t bch_snprint_string_list(char *buf, size_t size, const char * const list[],
118cafe5635SKent Overstreet 			    size_t selected)
119cafe5635SKent Overstreet {
120cafe5635SKent Overstreet 	char *out = buf;
121cafe5635SKent Overstreet 	size_t i;
122cafe5635SKent Overstreet 
123cafe5635SKent Overstreet 	for (i = 0; list[i]; i++)
124cafe5635SKent Overstreet 		out += snprintf(out, buf + size - out,
125cafe5635SKent Overstreet 				i == selected ? "[%s] " : "%s ", list[i]);
126cafe5635SKent Overstreet 
127cafe5635SKent Overstreet 	out[-1] = '\n';
128cafe5635SKent Overstreet 	return out - buf;
129cafe5635SKent Overstreet }
130cafe5635SKent Overstreet 
131169ef1cfSKent Overstreet ssize_t bch_read_string_list(const char *buf, const char * const list[])
132cafe5635SKent Overstreet {
133cafe5635SKent Overstreet 	size_t i;
134cafe5635SKent Overstreet 	char *s, *d = kstrndup(buf, PAGE_SIZE - 1, GFP_KERNEL);
135cafe5635SKent Overstreet 	if (!d)
136cafe5635SKent Overstreet 		return -ENOMEM;
137cafe5635SKent Overstreet 
138cafe5635SKent Overstreet 	s = strim(d);
139cafe5635SKent Overstreet 
140cafe5635SKent Overstreet 	for (i = 0; list[i]; i++)
141cafe5635SKent Overstreet 		if (!strcmp(list[i], s))
142cafe5635SKent Overstreet 			break;
143cafe5635SKent Overstreet 
144cafe5635SKent Overstreet 	kfree(d);
145cafe5635SKent Overstreet 
146cafe5635SKent Overstreet 	if (!list[i])
147cafe5635SKent Overstreet 		return -EINVAL;
148cafe5635SKent Overstreet 
149cafe5635SKent Overstreet 	return i;
150cafe5635SKent Overstreet }
151cafe5635SKent Overstreet 
152169ef1cfSKent Overstreet bool bch_is_zero(const char *p, size_t n)
153cafe5635SKent Overstreet {
154cafe5635SKent Overstreet 	size_t i;
155cafe5635SKent Overstreet 
156cafe5635SKent Overstreet 	for (i = 0; i < n; i++)
157cafe5635SKent Overstreet 		if (p[i])
158cafe5635SKent Overstreet 			return false;
159cafe5635SKent Overstreet 	return true;
160cafe5635SKent Overstreet }
161cafe5635SKent Overstreet 
162169ef1cfSKent Overstreet int bch_parse_uuid(const char *s, char *uuid)
163cafe5635SKent Overstreet {
164cafe5635SKent Overstreet 	size_t i, j, x;
165cafe5635SKent Overstreet 	memset(uuid, 0, 16);
166cafe5635SKent Overstreet 
167cafe5635SKent Overstreet 	for (i = 0, j = 0;
168cafe5635SKent Overstreet 	     i < strspn(s, "-0123456789:ABCDEFabcdef") && j < 32;
169cafe5635SKent Overstreet 	     i++) {
170cafe5635SKent Overstreet 		x = s[i] | 32;
171cafe5635SKent Overstreet 
172cafe5635SKent Overstreet 		switch (x) {
173cafe5635SKent Overstreet 		case '0'...'9':
174cafe5635SKent Overstreet 			x -= '0';
175cafe5635SKent Overstreet 			break;
176cafe5635SKent Overstreet 		case 'a'...'f':
177cafe5635SKent Overstreet 			x -= 'a' - 10;
178cafe5635SKent Overstreet 			break;
179cafe5635SKent Overstreet 		default:
180cafe5635SKent Overstreet 			continue;
181cafe5635SKent Overstreet 		}
182cafe5635SKent Overstreet 
183cafe5635SKent Overstreet 		if (!(j & 1))
184cafe5635SKent Overstreet 			x <<= 4;
185cafe5635SKent Overstreet 		uuid[j++ >> 1] |= x;
186cafe5635SKent Overstreet 	}
187cafe5635SKent Overstreet 	return i;
188cafe5635SKent Overstreet }
189cafe5635SKent Overstreet 
190169ef1cfSKent Overstreet void bch_time_stats_update(struct time_stats *stats, uint64_t start_time)
191cafe5635SKent Overstreet {
19265d22e91SKent Overstreet 	uint64_t now, duration, last;
19365d22e91SKent Overstreet 
19465d22e91SKent Overstreet 	spin_lock(&stats->lock);
19565d22e91SKent Overstreet 
19665d22e91SKent Overstreet 	now		= local_clock();
19765d22e91SKent Overstreet 	duration	= time_after64(now, start_time)
198cafe5635SKent Overstreet 		? now - start_time : 0;
19965d22e91SKent Overstreet 	last		= time_after64(now, stats->last)
200cafe5635SKent Overstreet 		? now - stats->last : 0;
201cafe5635SKent Overstreet 
202cafe5635SKent Overstreet 	stats->max_duration = max(stats->max_duration, duration);
203cafe5635SKent Overstreet 
204cafe5635SKent Overstreet 	if (stats->last) {
205cafe5635SKent Overstreet 		ewma_add(stats->average_duration, duration, 8, 8);
206cafe5635SKent Overstreet 
207cafe5635SKent Overstreet 		if (stats->average_frequency)
208cafe5635SKent Overstreet 			ewma_add(stats->average_frequency, last, 8, 8);
209cafe5635SKent Overstreet 		else
210cafe5635SKent Overstreet 			stats->average_frequency  = last << 8;
211cafe5635SKent Overstreet 	} else {
212cafe5635SKent Overstreet 		stats->average_duration  = duration << 8;
213cafe5635SKent Overstreet 	}
214cafe5635SKent Overstreet 
215cafe5635SKent Overstreet 	stats->last = now ?: 1;
21665d22e91SKent Overstreet 
21765d22e91SKent Overstreet 	spin_unlock(&stats->lock);
218cafe5635SKent Overstreet }
219cafe5635SKent Overstreet 
220c2a4f318SKent Overstreet /**
221c2a4f318SKent Overstreet  * bch_next_delay() - increment @d by the amount of work done, and return how
222c2a4f318SKent Overstreet  * long to delay until the next time to do some work.
223c2a4f318SKent Overstreet  *
224c2a4f318SKent Overstreet  * @d - the struct bch_ratelimit to update
225c2a4f318SKent Overstreet  * @done - the amount of work done, in arbitrary units
226c2a4f318SKent Overstreet  *
227c2a4f318SKent Overstreet  * Returns the amount of time to delay by, in jiffies
228c2a4f318SKent Overstreet  */
229c2a4f318SKent Overstreet uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done)
230cafe5635SKent Overstreet {
231cafe5635SKent Overstreet 	uint64_t now = local_clock();
232cafe5635SKent Overstreet 
23316749c23SKent Overstreet 	d->next += div_u64(done * NSEC_PER_SEC, d->rate);
23416749c23SKent Overstreet 
23516749c23SKent Overstreet 	if (time_before64(now + NSEC_PER_SEC, d->next))
23616749c23SKent Overstreet 		d->next = now + NSEC_PER_SEC;
23716749c23SKent Overstreet 
23816749c23SKent Overstreet 	if (time_after64(now - NSEC_PER_SEC * 2, d->next))
23916749c23SKent Overstreet 		d->next = now - NSEC_PER_SEC * 2;
240cafe5635SKent Overstreet 
241cafe5635SKent Overstreet 	return time_after64(d->next, now)
242cafe5635SKent Overstreet 		? div_u64(d->next - now, NSEC_PER_SEC / HZ)
243cafe5635SKent Overstreet 		: 0;
244cafe5635SKent Overstreet }
245cafe5635SKent Overstreet 
246169ef1cfSKent Overstreet void bch_bio_map(struct bio *bio, void *base)
247cafe5635SKent Overstreet {
2484f024f37SKent Overstreet 	size_t size = bio->bi_iter.bi_size;
249cafe5635SKent Overstreet 	struct bio_vec *bv = bio->bi_io_vec;
250cafe5635SKent Overstreet 
2514f024f37SKent Overstreet 	BUG_ON(!bio->bi_iter.bi_size);
252cafe5635SKent Overstreet 	BUG_ON(bio->bi_vcnt);
253cafe5635SKent Overstreet 
25493bbf583SAl Viro 	bv->bv_offset = base ? offset_in_page(base) : 0;
255cafe5635SKent Overstreet 	goto start;
256cafe5635SKent Overstreet 
257cafe5635SKent Overstreet 	for (; size; bio->bi_vcnt++, bv++) {
258cafe5635SKent Overstreet 		bv->bv_offset	= 0;
259cafe5635SKent Overstreet start:		bv->bv_len	= min_t(size_t, PAGE_SIZE - bv->bv_offset,
260cafe5635SKent Overstreet 					size);
261cafe5635SKent Overstreet 		if (base) {
262cafe5635SKent Overstreet 			bv->bv_page = is_vmalloc_addr(base)
263cafe5635SKent Overstreet 				? vmalloc_to_page(base)
264cafe5635SKent Overstreet 				: virt_to_page(base);
265cafe5635SKent Overstreet 
266cafe5635SKent Overstreet 			base += bv->bv_len;
267cafe5635SKent Overstreet 		}
268cafe5635SKent Overstreet 
269cafe5635SKent Overstreet 		size -= bv->bv_len;
270cafe5635SKent Overstreet 	}
271cafe5635SKent Overstreet }
272cafe5635SKent Overstreet 
273cafe5635SKent Overstreet /*
274cafe5635SKent Overstreet  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group (Any
275cafe5635SKent Overstreet  * use permitted, subject to terms of PostgreSQL license; see.)
276cafe5635SKent Overstreet 
277cafe5635SKent Overstreet  * If we have a 64-bit integer type, then a 64-bit CRC looks just like the
278cafe5635SKent Overstreet  * usual sort of implementation. (See Ross Williams' excellent introduction
279cafe5635SKent Overstreet  * A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS, available from
280cafe5635SKent Overstreet  * ftp://ftp.rocksoft.com/papers/crc_v3.txt or several other net sites.)
281cafe5635SKent Overstreet  * If we have no working 64-bit type, then fake it with two 32-bit registers.
282cafe5635SKent Overstreet  *
283cafe5635SKent Overstreet  * The present implementation is a normal (not "reflected", in Williams'
284cafe5635SKent Overstreet  * terms) 64-bit CRC, using initial all-ones register contents and a final
285cafe5635SKent Overstreet  * bit inversion. The chosen polynomial is borrowed from the DLT1 spec
286cafe5635SKent Overstreet  * (ECMA-182, available from http://www.ecma.ch/ecma1/STAND/ECMA-182.HTM):
287cafe5635SKent Overstreet  *
288cafe5635SKent Overstreet  * x^64 + x^62 + x^57 + x^55 + x^54 + x^53 + x^52 + x^47 + x^46 + x^45 +
289cafe5635SKent Overstreet  * x^40 + x^39 + x^38 + x^37 + x^35 + x^33 + x^32 + x^31 + x^29 + x^27 +
290cafe5635SKent Overstreet  * x^24 + x^23 + x^22 + x^21 + x^19 + x^17 + x^13 + x^12 + x^10 + x^9 +
291cafe5635SKent Overstreet  * x^7 + x^4 + x + 1
292cafe5635SKent Overstreet */
293cafe5635SKent Overstreet 
294cafe5635SKent Overstreet static const uint64_t crc_table[256] = {
295c19ed23aSKent Overstreet 	0x0000000000000000ULL, 0x42F0E1EBA9EA3693ULL, 0x85E1C3D753D46D26ULL,
296c19ed23aSKent Overstreet 	0xC711223CFA3E5BB5ULL, 0x493366450E42ECDFULL, 0x0BC387AEA7A8DA4CULL,
297c19ed23aSKent Overstreet 	0xCCD2A5925D9681F9ULL, 0x8E224479F47CB76AULL, 0x9266CC8A1C85D9BEULL,
298c19ed23aSKent Overstreet 	0xD0962D61B56FEF2DULL, 0x17870F5D4F51B498ULL, 0x5577EEB6E6BB820BULL,
299c19ed23aSKent Overstreet 	0xDB55AACF12C73561ULL, 0x99A54B24BB2D03F2ULL, 0x5EB4691841135847ULL,
300c19ed23aSKent Overstreet 	0x1C4488F3E8F96ED4ULL, 0x663D78FF90E185EFULL, 0x24CD9914390BB37CULL,
301c19ed23aSKent Overstreet 	0xE3DCBB28C335E8C9ULL, 0xA12C5AC36ADFDE5AULL, 0x2F0E1EBA9EA36930ULL,
302c19ed23aSKent Overstreet 	0x6DFEFF5137495FA3ULL, 0xAAEFDD6DCD770416ULL, 0xE81F3C86649D3285ULL,
303c19ed23aSKent Overstreet 	0xF45BB4758C645C51ULL, 0xB6AB559E258E6AC2ULL, 0x71BA77A2DFB03177ULL,
304c19ed23aSKent Overstreet 	0x334A9649765A07E4ULL, 0xBD68D2308226B08EULL, 0xFF9833DB2BCC861DULL,
305c19ed23aSKent Overstreet 	0x388911E7D1F2DDA8ULL, 0x7A79F00C7818EB3BULL, 0xCC7AF1FF21C30BDEULL,
306c19ed23aSKent Overstreet 	0x8E8A101488293D4DULL, 0x499B3228721766F8ULL, 0x0B6BD3C3DBFD506BULL,
307c19ed23aSKent Overstreet 	0x854997BA2F81E701ULL, 0xC7B97651866BD192ULL, 0x00A8546D7C558A27ULL,
308c19ed23aSKent Overstreet 	0x4258B586D5BFBCB4ULL, 0x5E1C3D753D46D260ULL, 0x1CECDC9E94ACE4F3ULL,
309c19ed23aSKent Overstreet 	0xDBFDFEA26E92BF46ULL, 0x990D1F49C77889D5ULL, 0x172F5B3033043EBFULL,
310c19ed23aSKent Overstreet 	0x55DFBADB9AEE082CULL, 0x92CE98E760D05399ULL, 0xD03E790CC93A650AULL,
311c19ed23aSKent Overstreet 	0xAA478900B1228E31ULL, 0xE8B768EB18C8B8A2ULL, 0x2FA64AD7E2F6E317ULL,
312c19ed23aSKent Overstreet 	0x6D56AB3C4B1CD584ULL, 0xE374EF45BF6062EEULL, 0xA1840EAE168A547DULL,
313c19ed23aSKent Overstreet 	0x66952C92ECB40FC8ULL, 0x2465CD79455E395BULL, 0x3821458AADA7578FULL,
314c19ed23aSKent Overstreet 	0x7AD1A461044D611CULL, 0xBDC0865DFE733AA9ULL, 0xFF3067B657990C3AULL,
315c19ed23aSKent Overstreet 	0x711223CFA3E5BB50ULL, 0x33E2C2240A0F8DC3ULL, 0xF4F3E018F031D676ULL,
316c19ed23aSKent Overstreet 	0xB60301F359DBE0E5ULL, 0xDA050215EA6C212FULL, 0x98F5E3FE438617BCULL,
317c19ed23aSKent Overstreet 	0x5FE4C1C2B9B84C09ULL, 0x1D14202910527A9AULL, 0x93366450E42ECDF0ULL,
318c19ed23aSKent Overstreet 	0xD1C685BB4DC4FB63ULL, 0x16D7A787B7FAA0D6ULL, 0x5427466C1E109645ULL,
319c19ed23aSKent Overstreet 	0x4863CE9FF6E9F891ULL, 0x0A932F745F03CE02ULL, 0xCD820D48A53D95B7ULL,
320c19ed23aSKent Overstreet 	0x8F72ECA30CD7A324ULL, 0x0150A8DAF8AB144EULL, 0x43A04931514122DDULL,
321c19ed23aSKent Overstreet 	0x84B16B0DAB7F7968ULL, 0xC6418AE602954FFBULL, 0xBC387AEA7A8DA4C0ULL,
322c19ed23aSKent Overstreet 	0xFEC89B01D3679253ULL, 0x39D9B93D2959C9E6ULL, 0x7B2958D680B3FF75ULL,
323c19ed23aSKent Overstreet 	0xF50B1CAF74CF481FULL, 0xB7FBFD44DD257E8CULL, 0x70EADF78271B2539ULL,
324c19ed23aSKent Overstreet 	0x321A3E938EF113AAULL, 0x2E5EB66066087D7EULL, 0x6CAE578BCFE24BEDULL,
325c19ed23aSKent Overstreet 	0xABBF75B735DC1058ULL, 0xE94F945C9C3626CBULL, 0x676DD025684A91A1ULL,
326c19ed23aSKent Overstreet 	0x259D31CEC1A0A732ULL, 0xE28C13F23B9EFC87ULL, 0xA07CF2199274CA14ULL,
327c19ed23aSKent Overstreet 	0x167FF3EACBAF2AF1ULL, 0x548F120162451C62ULL, 0x939E303D987B47D7ULL,
328c19ed23aSKent Overstreet 	0xD16ED1D631917144ULL, 0x5F4C95AFC5EDC62EULL, 0x1DBC74446C07F0BDULL,
329c19ed23aSKent Overstreet 	0xDAAD56789639AB08ULL, 0x985DB7933FD39D9BULL, 0x84193F60D72AF34FULL,
330c19ed23aSKent Overstreet 	0xC6E9DE8B7EC0C5DCULL, 0x01F8FCB784FE9E69ULL, 0x43081D5C2D14A8FAULL,
331c19ed23aSKent Overstreet 	0xCD2A5925D9681F90ULL, 0x8FDAB8CE70822903ULL, 0x48CB9AF28ABC72B6ULL,
332c19ed23aSKent Overstreet 	0x0A3B7B1923564425ULL, 0x70428B155B4EAF1EULL, 0x32B26AFEF2A4998DULL,
333c19ed23aSKent Overstreet 	0xF5A348C2089AC238ULL, 0xB753A929A170F4ABULL, 0x3971ED50550C43C1ULL,
334c19ed23aSKent Overstreet 	0x7B810CBBFCE67552ULL, 0xBC902E8706D82EE7ULL, 0xFE60CF6CAF321874ULL,
335c19ed23aSKent Overstreet 	0xE224479F47CB76A0ULL, 0xA0D4A674EE214033ULL, 0x67C58448141F1B86ULL,
336c19ed23aSKent Overstreet 	0x253565A3BDF52D15ULL, 0xAB1721DA49899A7FULL, 0xE9E7C031E063ACECULL,
337c19ed23aSKent Overstreet 	0x2EF6E20D1A5DF759ULL, 0x6C0603E6B3B7C1CAULL, 0xF6FAE5C07D3274CDULL,
338c19ed23aSKent Overstreet 	0xB40A042BD4D8425EULL, 0x731B26172EE619EBULL, 0x31EBC7FC870C2F78ULL,
339c19ed23aSKent Overstreet 	0xBFC9838573709812ULL, 0xFD39626EDA9AAE81ULL, 0x3A28405220A4F534ULL,
340c19ed23aSKent Overstreet 	0x78D8A1B9894EC3A7ULL, 0x649C294A61B7AD73ULL, 0x266CC8A1C85D9BE0ULL,
341c19ed23aSKent Overstreet 	0xE17DEA9D3263C055ULL, 0xA38D0B769B89F6C6ULL, 0x2DAF4F0F6FF541ACULL,
342c19ed23aSKent Overstreet 	0x6F5FAEE4C61F773FULL, 0xA84E8CD83C212C8AULL, 0xEABE6D3395CB1A19ULL,
343c19ed23aSKent Overstreet 	0x90C79D3FEDD3F122ULL, 0xD2377CD44439C7B1ULL, 0x15265EE8BE079C04ULL,
344c19ed23aSKent Overstreet 	0x57D6BF0317EDAA97ULL, 0xD9F4FB7AE3911DFDULL, 0x9B041A914A7B2B6EULL,
345c19ed23aSKent Overstreet 	0x5C1538ADB04570DBULL, 0x1EE5D94619AF4648ULL, 0x02A151B5F156289CULL,
346c19ed23aSKent Overstreet 	0x4051B05E58BC1E0FULL, 0x87409262A28245BAULL, 0xC5B073890B687329ULL,
347c19ed23aSKent Overstreet 	0x4B9237F0FF14C443ULL, 0x0962D61B56FEF2D0ULL, 0xCE73F427ACC0A965ULL,
348c19ed23aSKent Overstreet 	0x8C8315CC052A9FF6ULL, 0x3A80143F5CF17F13ULL, 0x7870F5D4F51B4980ULL,
349c19ed23aSKent Overstreet 	0xBF61D7E80F251235ULL, 0xFD913603A6CF24A6ULL, 0x73B3727A52B393CCULL,
350c19ed23aSKent Overstreet 	0x31439391FB59A55FULL, 0xF652B1AD0167FEEAULL, 0xB4A25046A88DC879ULL,
351c19ed23aSKent Overstreet 	0xA8E6D8B54074A6ADULL, 0xEA16395EE99E903EULL, 0x2D071B6213A0CB8BULL,
352c19ed23aSKent Overstreet 	0x6FF7FA89BA4AFD18ULL, 0xE1D5BEF04E364A72ULL, 0xA3255F1BE7DC7CE1ULL,
353c19ed23aSKent Overstreet 	0x64347D271DE22754ULL, 0x26C49CCCB40811C7ULL, 0x5CBD6CC0CC10FAFCULL,
354c19ed23aSKent Overstreet 	0x1E4D8D2B65FACC6FULL, 0xD95CAF179FC497DAULL, 0x9BAC4EFC362EA149ULL,
355c19ed23aSKent Overstreet 	0x158E0A85C2521623ULL, 0x577EEB6E6BB820B0ULL, 0x906FC95291867B05ULL,
356c19ed23aSKent Overstreet 	0xD29F28B9386C4D96ULL, 0xCEDBA04AD0952342ULL, 0x8C2B41A1797F15D1ULL,
357c19ed23aSKent Overstreet 	0x4B3A639D83414E64ULL, 0x09CA82762AAB78F7ULL, 0x87E8C60FDED7CF9DULL,
358c19ed23aSKent Overstreet 	0xC51827E4773DF90EULL, 0x020905D88D03A2BBULL, 0x40F9E43324E99428ULL,
359c19ed23aSKent Overstreet 	0x2CFFE7D5975E55E2ULL, 0x6E0F063E3EB46371ULL, 0xA91E2402C48A38C4ULL,
360c19ed23aSKent Overstreet 	0xEBEEC5E96D600E57ULL, 0x65CC8190991CB93DULL, 0x273C607B30F68FAEULL,
361c19ed23aSKent Overstreet 	0xE02D4247CAC8D41BULL, 0xA2DDA3AC6322E288ULL, 0xBE992B5F8BDB8C5CULL,
362c19ed23aSKent Overstreet 	0xFC69CAB42231BACFULL, 0x3B78E888D80FE17AULL, 0x7988096371E5D7E9ULL,
363c19ed23aSKent Overstreet 	0xF7AA4D1A85996083ULL, 0xB55AACF12C735610ULL, 0x724B8ECDD64D0DA5ULL,
364c19ed23aSKent Overstreet 	0x30BB6F267FA73B36ULL, 0x4AC29F2A07BFD00DULL, 0x08327EC1AE55E69EULL,
365c19ed23aSKent Overstreet 	0xCF235CFD546BBD2BULL, 0x8DD3BD16FD818BB8ULL, 0x03F1F96F09FD3CD2ULL,
366c19ed23aSKent Overstreet 	0x41011884A0170A41ULL, 0x86103AB85A2951F4ULL, 0xC4E0DB53F3C36767ULL,
367c19ed23aSKent Overstreet 	0xD8A453A01B3A09B3ULL, 0x9A54B24BB2D03F20ULL, 0x5D45907748EE6495ULL,
368c19ed23aSKent Overstreet 	0x1FB5719CE1045206ULL, 0x919735E51578E56CULL, 0xD367D40EBC92D3FFULL,
369c19ed23aSKent Overstreet 	0x1476F63246AC884AULL, 0x568617D9EF46BED9ULL, 0xE085162AB69D5E3CULL,
370c19ed23aSKent Overstreet 	0xA275F7C11F7768AFULL, 0x6564D5FDE549331AULL, 0x279434164CA30589ULL,
371c19ed23aSKent Overstreet 	0xA9B6706FB8DFB2E3ULL, 0xEB46918411358470ULL, 0x2C57B3B8EB0BDFC5ULL,
372c19ed23aSKent Overstreet 	0x6EA7525342E1E956ULL, 0x72E3DAA0AA188782ULL, 0x30133B4B03F2B111ULL,
373c19ed23aSKent Overstreet 	0xF7021977F9CCEAA4ULL, 0xB5F2F89C5026DC37ULL, 0x3BD0BCE5A45A6B5DULL,
374c19ed23aSKent Overstreet 	0x79205D0E0DB05DCEULL, 0xBE317F32F78E067BULL, 0xFCC19ED95E6430E8ULL,
375c19ed23aSKent Overstreet 	0x86B86ED5267CDBD3ULL, 0xC4488F3E8F96ED40ULL, 0x0359AD0275A8B6F5ULL,
376c19ed23aSKent Overstreet 	0x41A94CE9DC428066ULL, 0xCF8B0890283E370CULL, 0x8D7BE97B81D4019FULL,
377c19ed23aSKent Overstreet 	0x4A6ACB477BEA5A2AULL, 0x089A2AACD2006CB9ULL, 0x14DEA25F3AF9026DULL,
378c19ed23aSKent Overstreet 	0x562E43B4931334FEULL, 0x913F6188692D6F4BULL, 0xD3CF8063C0C759D8ULL,
379c19ed23aSKent Overstreet 	0x5DEDC41A34BBEEB2ULL, 0x1F1D25F19D51D821ULL, 0xD80C07CD676F8394ULL,
380c19ed23aSKent Overstreet 	0x9AFCE626CE85B507ULL,
381cafe5635SKent Overstreet };
382cafe5635SKent Overstreet 
383169ef1cfSKent Overstreet uint64_t bch_crc64_update(uint64_t crc, const void *_data, size_t len)
384cafe5635SKent Overstreet {
385cafe5635SKent Overstreet 	const unsigned char *data = _data;
386cafe5635SKent Overstreet 
387cafe5635SKent Overstreet 	while (len--) {
388cafe5635SKent Overstreet 		int i = ((int) (crc >> 56) ^ *data++) & 0xFF;
389cafe5635SKent Overstreet 		crc = crc_table[i] ^ (crc << 8);
390cafe5635SKent Overstreet 	}
391cafe5635SKent Overstreet 
392cafe5635SKent Overstreet 	return crc;
393cafe5635SKent Overstreet }
394cafe5635SKent Overstreet 
395169ef1cfSKent Overstreet uint64_t bch_crc64(const void *data, size_t len)
396cafe5635SKent Overstreet {
397c19ed23aSKent Overstreet 	uint64_t crc = 0xffffffffffffffffULL;
398cafe5635SKent Overstreet 
399169ef1cfSKent Overstreet 	crc = bch_crc64_update(crc, data, len);
400cafe5635SKent Overstreet 
401c19ed23aSKent Overstreet 	return crc ^ 0xffffffffffffffffULL;
402cafe5635SKent Overstreet }
403