diff options
-rw-r--r-- | bcache.h | 13 | ||||
-rw-r--r-- | features.c | 4 | ||||
-rw-r--r-- | lib.c | 17 | ||||
-rw-r--r-- | lib.h | 2 |
4 files changed, 28 insertions, 8 deletions
@@ -100,7 +100,7 @@ struct cache_sb_disk { __le16 keys; }; __le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */ - __le16 bucket_size_hi; + __le16 obso_bucket_size_hi; /* obsoleted */ }; /* @@ -202,7 +202,8 @@ uint64_t crc64(const void *data, size_t len); #define BCH_FEATURE_COMPAT_SUPP 0 #define BCH_FEATURE_RO_COMPAT_SUPP 0 -#define BCH_FEATURE_INCOMPAT_SUPP BCH_FEATURE_INCOMPAT_LARGE_BUCKET +#define BCH_FEATURE_INCOMPAT_SUPP (BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET| \ + BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE) #define BCH_HAS_COMPAT_FEATURE(sb, mask) \ ((sb)->feature_compat & (mask)) @@ -214,7 +215,10 @@ uint64_t crc64(const void *data, size_t len); /* Feature set definition */ /* Incompat feature set */ -#define BCH_FEATURE_INCOMPAT_LARGE_BUCKET 0x0001 /* 32bit bucket size */ +/* 32bit bucket size, obsoleted */ +#define BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET 0x0001 +/* real bucket size is (1 << bucket_size) */ +#define BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE 0x0002 #define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \ static inline int bch_has_feature_##name(struct cache_sb *sb) \ @@ -267,6 +271,7 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \ ~BCH##_FEATURE_INCOMPAT_##flagname; \ } -BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET); +BCH_FEATURE_INCOMPAT_FUNCS(obso_large_bucket, OBSO_LARGE_BUCKET); +BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LOG_LARGE_BUCKET_SIZE); #endif @@ -20,7 +20,9 @@ struct feature { }; static struct feature feature_list[] = { - {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LARGE_BUCKET, + {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET, + "obso_large_bucket"}, + {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE, "large_bucket"}, {0, 0, 0 }, }; @@ -21,6 +21,19 @@ * utils function */ +static unsigned int log2_u32(uint32_t n) +{ + int r = 0; + + n = n >> 1; + while (n) { + n = n >> 1; + r++; + } + + return r; +} + static void trim_prefix(char *dest, char *src, int num) { strcpy(dest, src + num); @@ -772,7 +785,7 @@ struct cache_sb *to_cache_sb(struct cache_sb *sb, if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES && bch_has_feature_large_bucket(sb)) - sb->bucket_size += le16_to_cpu(sb_disk->bucket_size_hi) << 16; + sb->bucket_size = 1 << le16_to_cpu(sb_disk->bucket_size); return sb; } @@ -824,7 +837,7 @@ struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk, if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES && bch_has_feature_large_bucket(sb)) - sb_disk->bucket_size_hi = cpu_to_le16(sb->bucket_size >> 16); + sb_disk->bucket_size = cpu_to_le16(log2_u32(sb->bucket_size)); return sb_disk; } @@ -13,7 +13,7 @@ struct dev { char label[SB_LABEL_SIZE + 1]; char uuid[40]; uint16_t sectors_per_block; - uint16_t sectors_per_bucket; + uint32_t sectors_per_bucket; char cset[40]; char state[40]; char bname[40]; |