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.

CRs-Fixed: 2288669

Change-Id: I3846a86925efbfbf8840e99226962de6d09b3b70
Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
Signed-off-by: Minming Qi <mqi@codeaurora.org>
Signed-off-by: zhaochen <zhaochen@codeaurora.org>
diff --git a/drivers/block/vs_block_client.c b/drivers/block/vs_block_client.c
index 974f8b9..e362ae5 100644
--- a/drivers/block/vs_block_client.c
+++ b/drivers/block/vs_block_client.c
@@ -255,20 +255,16 @@
 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");
 		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",
-				(size_t)bio_size(bio), bio_sectors(bio),
-				(size_t)client->client.sector_size);
+		"bio has %zd bytes, unexpected for sector_size of %zd bytes",
+		(size_t)bio_size(bio),
+		(size_t)client->client.sector_size);
 		return -EIO;
 	}
 
@@ -550,6 +546,10 @@
 			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 +585,8 @@
 	 */
 	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 +753,8 @@
 	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);
diff --git a/drivers/block/vs_block_server.c b/drivers/block/vs_block_server.c
index 9d20f6a..42bc273 100644
--- a/drivers/block/vs_block_server.c
+++ b/drivers/block/vs_block_server.c
@@ -31,7 +31,10 @@
 #include <vservices/wait.h>
 
 #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
@@ -1035,12 +1038,15 @@
 	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;