]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/md/dm-verity.c
caif: add a sanity check to the tty name
[karo-tx-linux.git] / drivers / md / dm-verity.c
index b948fd864d457e9ce857d1d04fd74bf8997e0aee..4b7941db3aff33223481464f24a162d101ab7698 100644 (file)
@@ -451,7 +451,7 @@ static void verity_prefetch_io(struct work_struct *work)
                                goto no_prefetch_cluster;
 
                        if (unlikely(cluster & (cluster - 1)))
-                               cluster = 1 << (fls(cluster) - 1);
+                               cluster = 1 << __fls(cluster);
 
                        hash_block_start &= ~(sector_t)(cluster - 1);
                        hash_block_end |= cluster - 1;
@@ -695,8 +695,8 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
                goto bad;
        }
 
-       if (sscanf(argv[0], "%d%c", &num, &dummy) != 1 ||
-           num < 0 || num > 1) {
+       if (sscanf(argv[0], "%u%c", &num, &dummy) != 1 ||
+           num > 1) {
                ti->error = "Invalid version";
                r = -EINVAL;
                goto bad;
@@ -723,7 +723,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
                r = -EINVAL;
                goto bad;
        }
-       v->data_dev_block_bits = ffs(num) - 1;
+       v->data_dev_block_bits = __ffs(num);
 
        if (sscanf(argv[4], "%u%c", &num, &dummy) != 1 ||
            !num || (num & (num - 1)) ||
@@ -733,7 +733,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
                r = -EINVAL;
                goto bad;
        }
-       v->hash_dev_block_bits = ffs(num) - 1;
+       v->hash_dev_block_bits = __ffs(num);
 
        if (sscanf(argv[5], "%llu%c", &num_ll, &dummy) != 1 ||
            (sector_t)(num_ll << (v->data_dev_block_bits - SECTOR_SHIFT))
@@ -812,7 +812,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
        }
 
        v->hash_per_block_bits =
-               fls((1 << v->hash_dev_block_bits) / v->digest_size) - 1;
+               __fls((1 << v->hash_dev_block_bits) / v->digest_size);
 
        v->levels = 0;
        if (v->data_blocks)
@@ -831,9 +831,8 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
        for (i = v->levels - 1; i >= 0; i--) {
                sector_t s;
                v->hash_level_block[i] = hash_position;
-               s = verity_position_at_level(v, v->data_blocks, i);
-               s = (s >> v->hash_per_block_bits) +
-                   !!(s & ((1 << v->hash_per_block_bits) - 1));
+               s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1)
+                                       >> ((i + 1) * v->hash_per_block_bits);
                if (hash_position + s < hash_position) {
                        ti->error = "Hash device offset overflow";
                        r = -E2BIG;