mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
bcache: add read_super_common() to read major part of super block
Later patches will introduce feature set bits to on-disk super block and increase super block version. Current code in read_super() which reads common part of super block for version BCACHE_SB_VERSION_CDEV and version BCACHE_SB_VERSION_CDEV_WITH_UUID will be shared with the new version. Therefore this patch moves the reusable part into read_super_common(), this preparation patch will make later patches more simplier and only focus on new feature set bits. Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
7a14812679
commit
5b21403c7f
@ -59,6 +59,67 @@ struct workqueue_struct *bch_journal_wq;
|
|||||||
|
|
||||||
/* Superblock */
|
/* Superblock */
|
||||||
|
|
||||||
|
static const char *read_super_common(struct cache_sb *sb, struct block_device *bdev,
|
||||||
|
struct cache_sb_disk *s)
|
||||||
|
{
|
||||||
|
const char *err;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
sb->nbuckets = le64_to_cpu(s->nbuckets);
|
||||||
|
sb->bucket_size = le16_to_cpu(s->bucket_size);
|
||||||
|
|
||||||
|
sb->nr_in_set = le16_to_cpu(s->nr_in_set);
|
||||||
|
sb->nr_this_dev = le16_to_cpu(s->nr_this_dev);
|
||||||
|
|
||||||
|
err = "Too many buckets";
|
||||||
|
if (sb->nbuckets > LONG_MAX)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Not enough buckets";
|
||||||
|
if (sb->nbuckets < 1 << 7)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Bad block/bucket size";
|
||||||
|
if (!is_power_of_2(sb->block_size) ||
|
||||||
|
sb->block_size > PAGE_SECTORS ||
|
||||||
|
!is_power_of_2(sb->bucket_size) ||
|
||||||
|
sb->bucket_size < PAGE_SECTORS)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Invalid superblock: device too small";
|
||||||
|
if (get_capacity(bdev->bd_disk) <
|
||||||
|
sb->bucket_size * sb->nbuckets)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Bad UUID";
|
||||||
|
if (bch_is_zero(sb->set_uuid, 16))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Bad cache device number in set";
|
||||||
|
if (!sb->nr_in_set ||
|
||||||
|
sb->nr_in_set <= sb->nr_this_dev ||
|
||||||
|
sb->nr_in_set > MAX_CACHES_PER_SET)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Journal buckets not sequential";
|
||||||
|
for (i = 0; i < sb->keys; i++)
|
||||||
|
if (sb->d[i] != sb->first_bucket + i)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Too many journal buckets";
|
||||||
|
if (sb->first_bucket + sb->keys > sb->nbuckets)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = "Invalid superblock: first bucket comes before end of super";
|
||||||
|
if (sb->first_bucket * sb->bucket_size < 16)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
err:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
|
static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
|
||||||
struct cache_sb_disk **res)
|
struct cache_sb_disk **res)
|
||||||
{
|
{
|
||||||
@ -133,55 +194,9 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
|
|||||||
break;
|
break;
|
||||||
case BCACHE_SB_VERSION_CDEV:
|
case BCACHE_SB_VERSION_CDEV:
|
||||||
case BCACHE_SB_VERSION_CDEV_WITH_UUID:
|
case BCACHE_SB_VERSION_CDEV_WITH_UUID:
|
||||||
sb->nbuckets = le64_to_cpu(s->nbuckets);
|
err = read_super_common(sb, bdev, s);
|
||||||
sb->bucket_size = le16_to_cpu(s->bucket_size);
|
if (err)
|
||||||
|
|
||||||
sb->nr_in_set = le16_to_cpu(s->nr_in_set);
|
|
||||||
sb->nr_this_dev = le16_to_cpu(s->nr_this_dev);
|
|
||||||
|
|
||||||
err = "Too many buckets";
|
|
||||||
if (sb->nbuckets > LONG_MAX)
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
err = "Not enough buckets";
|
|
||||||
if (sb->nbuckets < 1 << 7)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Bad block/bucket size";
|
|
||||||
if (!is_power_of_2(sb->block_size) ||
|
|
||||||
sb->block_size > PAGE_SECTORS ||
|
|
||||||
!is_power_of_2(sb->bucket_size) ||
|
|
||||||
sb->bucket_size < PAGE_SECTORS)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Invalid superblock: device too small";
|
|
||||||
if (get_capacity(bdev->bd_disk) <
|
|
||||||
sb->bucket_size * sb->nbuckets)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Bad UUID";
|
|
||||||
if (bch_is_zero(sb->set_uuid, 16))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Bad cache device number in set";
|
|
||||||
if (!sb->nr_in_set ||
|
|
||||||
sb->nr_in_set <= sb->nr_this_dev ||
|
|
||||||
sb->nr_in_set > MAX_CACHES_PER_SET)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Journal buckets not sequential";
|
|
||||||
for (i = 0; i < sb->keys; i++)
|
|
||||||
if (sb->d[i] != sb->first_bucket + i)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Too many journal buckets";
|
|
||||||
if (sb->first_bucket + sb->keys > sb->nbuckets)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
err = "Invalid superblock: first bucket comes before end of super";
|
|
||||||
if (sb->first_bucket * sb->bucket_size < 16)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = "Unsupported superblock version";
|
err = "Unsupported superblock version";
|
||||||
|
Loading…
Reference in New Issue
Block a user