From 8330799340d88e2d5812b99b680681a2f5e7d31d Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Mon, 1 Jun 2020 10:53:02 -0700 Subject: ANDROID: dm-bow: Add block_size option Also consolidated changes to limits, including no longer changing underlying device. Bug: 153512828 Test: device boots, checkpoints can be committed or rolled back with and without this parameter, parameter is accepted Change-Id: I6fcb9bc21353a16ae0bf8998ffa22094eb1cbf3a Signed-off-by: Paul Lawrence (cherry picked from commit 7df64f62169ca56286ba49bca3116e9786fd1616) --- drivers/md/dm-bow.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/drivers/md/dm-bow.c b/drivers/md/dm-bow.c index 0d1ddb2b6e61..96ddba82ed24 100644 --- a/drivers/md/dm-bow.c +++ b/drivers/md/dm-bow.c @@ -622,6 +622,72 @@ static void dm_bow_dtr(struct dm_target *ti) kfree(bc); } +static void dm_bow_io_hints(struct dm_target *ti, struct queue_limits *limits) +{ + struct bow_context *bc = ti->private; + const unsigned int block_size = bc->block_size; + + limits->logical_block_size = + max_t(unsigned short, limits->logical_block_size, block_size); + limits->physical_block_size = + max_t(unsigned int, limits->physical_block_size, block_size); + limits->io_min = max_t(unsigned int, limits->io_min, block_size); + + if (limits->max_discard_sectors == 0) { + limits->discard_granularity = 1 << 12; + limits->max_hw_discard_sectors = 1 << 15; + limits->max_discard_sectors = 1 << 15; + bc->forward_trims = false; + } else { + limits->discard_granularity = 1 << 12; + bc->forward_trims = true; + } +} + +static int dm_bow_ctr_optional(struct dm_target *ti, unsigned int argc, + char **argv) +{ + struct bow_context *bc = ti->private; + struct dm_arg_set as; + static const struct dm_arg _args[] = { + {0, 1, "Invalid number of feature args"}, + }; + unsigned int opt_params; + const char *opt_string; + int err; + char dummy; + + as.argc = argc; + as.argv = argv; + + err = dm_read_arg_group(_args, &as, &opt_params, &ti->error); + if (err) + return err; + + while (opt_params--) { + opt_string = dm_shift_arg(&as); + if (!opt_string) { + ti->error = "Not enough feature arguments"; + return -EINVAL; + } + + if (sscanf(opt_string, "block_size:%u%c", + &bc->block_size, &dummy) == 1) { + if (bc->block_size < SECTOR_SIZE || + bc->block_size > 4096 || + !is_power_of_2(bc->block_size)) { + ti->error = "Invalid block_size"; + return -EINVAL; + } + } else { + ti->error = "Invalid feature arguments"; + return -EINVAL; + } + } + + return 0; +} + static int dm_bow_ctr(struct dm_target *ti, unsigned int argc, char **argv) { struct bow_context *bc; @@ -629,7 +695,7 @@ static int dm_bow_ctr(struct dm_target *ti, unsigned int argc, char **argv) int ret; struct mapped_device *md = dm_table_get_md(ti->table); - if (argc != 1) { + if (argc < 1) { ti->error = "Invalid argument count"; return -EINVAL; } @@ -652,17 +718,13 @@ static int dm_bow_ctr(struct dm_target *ti, unsigned int argc, char **argv) goto bad; } - if (bc->dev->bdev->bd_queue->limits.max_discard_sectors == 0) { - bc->dev->bdev->bd_queue->limits.discard_granularity = 1 << 12; - bc->dev->bdev->bd_queue->limits.max_hw_discard_sectors = 1 << 15; - bc->dev->bdev->bd_queue->limits.max_discard_sectors = 1 << 15; - bc->forward_trims = false; - } else { - bc->dev->bdev->bd_queue->limits.discard_granularity = 1 << 12; - bc->forward_trims = true; + bc->block_size = bc->dev->bdev->bd_queue->limits.logical_block_size; + if (argc > 1) { + ret = dm_bow_ctr_optional(ti, argc - 1, &argv[1]); + if (ret) + goto bad; } - bc->block_size = bc->dev->bdev->bd_queue->limits.logical_block_size; bc->block_shift = ilog2(bc->block_size); bc->log_sector = kzalloc(bc->block_size, GFP_KERNEL); if (!bc->log_sector) { @@ -1206,7 +1268,7 @@ static int dm_bow_iterate_devices(struct dm_target *ti, static struct target_type bow_target = { .name = "bow", - .version = {1, 1, 1}, + .version = {1, 2, 0}, .module = THIS_MODULE, .ctr = dm_bow_ctr, .dtr = dm_bow_dtr, @@ -1214,6 +1276,7 @@ static struct target_type bow_target = { .status = dm_bow_status, .prepare_ioctl = dm_bow_prepare_ioctl, .iterate_devices = dm_bow_iterate_devices, + .io_hints = dm_bow_io_hints, }; int __init dm_bow_init(void) -- cgit v1.2.3 From 9fe854df0eac27f6cad5dbdd149cfd499872c493 Mon Sep 17 00:00:00 2001 From: Daniel Mentz Date: Thu, 28 May 2020 18:47:31 -0700 Subject: ANDROID: Incremental fs: Remove dependency on PKCS7_MESSAGE_PARSER Incremental fs appears to not depend on pkcs7 anymore. Bug: 151584760 Signed-off-by: Daniel Mentz Change-Id: I809b4b5651d84ca70fd8bf837765e33df8547418 Signed-off-by: Paul Lawrence (cherry picked from commit 83c1d9116ec0d695b02f36cda51f305257718e09) --- fs/incfs/Kconfig | 1 - fs/incfs/integrity.c | 1 - 2 files changed, 2 deletions(-) diff --git a/fs/incfs/Kconfig b/fs/incfs/Kconfig index a655d599ea46..1ffe31a9c0ff 100644 --- a/fs/incfs/Kconfig +++ b/fs/incfs/Kconfig @@ -9,7 +9,6 @@ config INCREMENTAL_FS select X509_CERTIFICATE_PARSER select ASYMMETRIC_KEY_TYPE select ASYMMETRIC_PUBLIC_KEY_SUBTYPE - select PKCS7_MESSAGE_PARSER help Incremental FS is a read-only virtual file system that facilitates execution of programs while their binaries are still being lazily downloaded over the diff --git a/fs/incfs/integrity.c b/fs/incfs/integrity.c index d049988ef037..bce319ec2e52 100644 --- a/fs/incfs/integrity.c +++ b/fs/incfs/integrity.c @@ -6,7 +6,6 @@ #include #include #include -#include #include "integrity.h" -- cgit v1.2.3