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