Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83307993 authored by Paul Lawrence's avatar Paul Lawrence
Browse files

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: default avatarPaul Lawrence <paullawrence@google.com>
(cherry picked from commit 7df64f62169ca56286ba49bca3116e9786fd1616)
parent 3c5daa41
Loading
Loading
Loading
Loading
+74 −11
Original line number Diff line number Diff line
@@ -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)