[PATCH 05/15] ssc: remove blk_sz in struct ssc_info

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Storing the same value in two places is not a good idea. Use the block
descriptor directly (via ssc_get_block_length).

TODO: ssc_get_block_length should be in one header file.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>
---
 usr/bs_ssc.c |   31 +++++++++++++++++++------------
 usr/ssc.c    |    3 +--
 usr/ssc.h    |    2 --
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
index 4ae3fd6..ca17eed 100644
--- a/usr/bs_ssc.c
+++ b/usr/bs_ssc.c
@@ -39,6 +39,11 @@
 #include "bs_ssc.h"
 #include "ssc.h"
 
+static inline uint32_t ssc_get_block_length(struct scsi_lu *lu)
+{
+	return get_unaligned_be24(lu->mode_block_descriptor + 5);
+}
+
 /* I'm sure there is a more efficent method then this */
 static int32_t be24_to_2comp(uint8_t *c)
 {
@@ -320,6 +325,7 @@ static int resp_fixed_read(struct scsi_cmd *cmd, uint8_t *buf, uint32_t length)
 	int count;
 	ssize_t residue;
 	int fd;
+	uint32_t block_length = ssc_get_block_length(cmd->dev);
 
 	count = be24_to_uint(&cmd->scb[2]);
 	ssc = dtype_priv(cmd->dev);
@@ -334,24 +340,24 @@ static int resp_fixed_read(struct scsi_cmd *cmd, uint8_t *buf, uint32_t length)
 			goto rd_err;
 		}
 
-		if (ssc->blk_sz != ssc->c_blk->blk_sz) {
+		if (block_length != ssc->c_blk->blk_sz) {
 			eprintf("block size mismatch %d vs %d\n",
-				ssc->blk_sz, ssc->c_blk->blk_sz);
+				block_length, ssc->c_blk->blk_sz);
 			sense_data_build(cmd, MEDIUM_ERROR,
 						ASC_MEDIUM_FORMAT_CORRUPT);
 			goto rd_err;
 		}
 
-		residue = pread(fd, buf, ssc->blk_sz,
+		residue = pread(fd, buf, block_length,
 				ssc->c_blk->curr + sizeof(struct blk_header));
-		if (ssc->blk_sz != residue) {
+		if (block_length != residue) {
 			eprintf("Could only read %d bytes, not %d\n",
-					(int)residue, ssc->blk_sz);
+					(int)residue, block_length);
 			sense_data_build(cmd, MEDIUM_ERROR, ASC_READ_ERROR);
 			goto rd_err;
 		}
-		ret += ssc->blk_sz;
-		buf += ssc->blk_sz;
+		ret += block_length;
+		buf += block_length;
 
 		if (skip_next_header(cmd->dev)) {
 			eprintf("Could not read next header\n");
@@ -376,6 +382,7 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
 	int32_t count;
 	int8_t fixed;
 	int8_t sti;
+	uint32_t block_length = ssc_get_block_length(cmd->dev);
 
 	ret = 0;
 	length = 0;
@@ -449,21 +456,21 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
 		}
 
 		for (i = 0, ret = 0; i < count; i++) {
-			if (append_blk(cmd, buf, ssc->blk_sz,
-					ssc->blk_sz, BLK_UNCOMPRESS_DATA)) {
+			if (append_blk(cmd, buf, block_length,
+					block_length, BLK_UNCOMPRESS_DATA)) {
 				sense_data_build(cmd, MEDIUM_ERROR,
 						ASC_WRITE_ERROR);
 				result = SAM_STAT_CHECK_CONDITION;
 				break;
 			}
-			buf += ssc->blk_sz;
-			ret += ssc->blk_sz;
+			buf += block_length;
+			ret += block_length;
 		}
 
 		dprintf("*** WRITE_6 count: %d, length: %d, ret: %d, fixed: %s,"
 			" ssc->blk_sz: %d\n",
 			count, length, ret, (fixed) ? "Yes" : "No",
-			ssc->blk_sz);
+			block_length);
 
 		if (ret != length) {
 			sense_data_build(cmd, MEDIUM_ERROR, ASC_WRITE_ERROR);
diff --git a/usr/ssc.c b/usr/ssc.c
index 597b0d6..6c8b51f 100644
--- a/usr/ssc.c
+++ b/usr/ssc.c
@@ -125,8 +125,7 @@ static int ssc_lu_init(struct scsi_lu *lu)
 	put_unaligned_be24(0, data + 1);
 
 	/* Set default blk size */
-	ssc->blk_sz = 0;
-	put_unaligned_be24(ssc->blk_sz, data + 5);
+	put_unaligned_be24(0, data + 5);
 
 	/* Vendor uniq - However most apps seem to call for mode page 0*/
 	add_mode_page(lu, "0:0:0");
diff --git a/usr/ssc.h b/usr/ssc.h
index 9b2d36f..42b8a53 100644
--- a/usr/ssc.h
+++ b/usr/ssc.h
@@ -52,8 +52,6 @@ struct MAM {
 };
 
 struct ssc_info {
-/* blk_size is 'master'. Build block descriptor data from this value */
-	uint32_t blk_sz;
 	uint64_t bytes_read;	/* Bytes read this load */
 	uint64_t bytes_written;	/* Bytes written this load */
 
-- 
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux