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

Commit 4bfd2011 authored by Neeraj Upadhyay's avatar Neeraj Upadhyay Committed by Murali Nalajala
Browse files

block: vservices: fix client and server to work for UFS



Fix block vservice client and server to support UFS storage,
which requires a minimum block size of 4096 bytes.

Change-Id: I3846a86925efbfbf8840e99226962de6d09b3b70
Signed-off-by: default avatarNeeraj Upadhyay <neeraju@codeaurora.org>
Signed-off-by: default avatarMurali Nalajala <mnalajal@codeaurora.org>
Signed-off-by: default avatarPrakruthi Deepak Heragu <pheragu@codeaurora.org>
parent 0f0f1fa0
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -255,19 +255,16 @@ static int vs_block_client_blkdev_getgeo(struct block_device *bdev,
static int vs_block_client_check_sector_size(struct block_client *client,
		struct bio *bio)
{
	unsigned int expected_bytes;

	if (unlikely(!bio_sectors(bio))) {
		dev_err(&client->service->dev, "zero-length bio\n");
		return -EIO;
	}

	expected_bytes = bio_sectors(bio) * client->client.sector_size;
	if (unlikely(bio_size(bio) != expected_bytes)) {
	if (unlikely(bio_size(bio) % client->client.sector_size)) {
		dev_err(&client->service->dev,
				"bio has %zd bytes, which is unexpected "
				"for %d sectors of %zd bytes each\n",
				(size_t)bio_size(bio), bio_sectors(bio),
				"for sector_size of %zd bytes\n",
				(size_t)bio_size(bio),
				(size_t)client->client.sector_size);
		return -EIO;
	}
@@ -550,6 +547,10 @@ static int vs_block_client_disk_add(struct block_client *client)
			client->client.segment_size /
			client->client.sector_size);
	blk_queue_max_hw_sectors(blkdev->queue, max_hw_sectors);
	blk_queue_logical_block_size(blkdev->queue,
		client->client.sector_size);
	blk_queue_physical_block_size(blkdev->queue,
		client->client.sector_size);

	blkdev->disk = alloc_disk(PERDEV_MINORS);
	if (!blkdev->disk) {
@@ -585,7 +586,8 @@ static int vs_block_client_disk_add(struct block_client *client)
	 */
	snprintf(blkdev->disk->disk_name, sizeof(blkdev->disk->disk_name),
			"%s%d", CLIENT_BLKDEV_NAME, blkdev->id);
	set_capacity(blkdev->disk, client->client.device_sectors);
	set_capacity(blkdev->disk, client->client.device_sectors *
		(client->client.sector_size >> 9));

	/*
	 * We need to hold a reference on blkdev across add_disk(), to make
@@ -752,7 +754,8 @@ static void vs_block_client_opened(struct vs_client_block_state *state)
	struct block_client *client = state_to_block_client(state);

#if !defined(CONFIG_LBDAF) && !defined(CONFIG_64BIT)
	if (state->device_sectors >> (sizeof(sector_t) * 8)) {
	if ((state->device_sectors * (state->sector_size >> 9))
			>> (sizeof(sector_t) * 8)) {
		dev_err(&client->service->dev,
				"Client doesn't support full capacity large block devices\n");
		vs_client_block_close(state);
+8 −2
Original line number Diff line number Diff line
@@ -32,7 +32,10 @@
#include "../drivers/md/bcache/util.c"

#define VS_BLOCK_BLKDEV_DEFAULT_MODE FMODE_READ
/* Must match Linux bio sector_size (512 bytes) */
#define VS_BLOCK_BLK_DEF_SECTOR_SIZE 512
/* XXX should lookup block device physical_block_size */
#define VS_BLOCK_BLK_DEF_MIN_SECTORS 8

/*
 * Metadata for a request. Note that the bio must be embedded at the end of
@@ -1036,12 +1039,15 @@ vs_block_server_attach_block_device(struct block_server *server)
	if (IS_ERR(bdev))
		return bdev;

	// XXX get block device physical block size
	server->sector_size		= VS_BLOCK_BLK_DEF_SECTOR_SIZE;
	server->server.segment_size	= round_down(
		vs_service_max_mbuf_size(server->service) -
		sizeof(vs_message_id_t), server->sector_size);
	server->server.sector_size	= server->sector_size;
	server->server.device_sectors	= bdev->bd_part->nr_sects;
	server->server.sector_size	= server->sector_size *
						VS_BLOCK_BLK_DEF_MIN_SECTORS;
	server->server.device_sectors	= bdev->bd_part->nr_sects /
						VS_BLOCK_BLK_DEF_MIN_SECTORS;
	if (bdev_read_only(bdev))
		server->server.readonly = true;
	server->server.flushable = true;