[stgt] [PATCH 09/15] ssc: set the FILEMARK bit in sense in fixed read

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sun Oct 5 16:37:39 CEST 2008


This also set the information field in sense to the remaining length.

ssc_sense_data_build() is added to set up the information field. It
would be better to replace sense_data_build with this.

TODO: support descriptor format

Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 usr/bs_ssc.c |   23 +++++++++++++++++++++--
 usr/ssc.c    |    3 +++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
index a685673..bb5907a 100644
--- a/usr/bs_ssc.c
+++ b/usr/bs_ssc.c
@@ -39,6 +39,18 @@
 #include "bs_ssc.h"
 #include "ssc.h"
 
+static void ssc_sense_data_build(struct scsi_cmd *cmd, uint8_t key,
+				 uint16_t asc, uint8_t *info, int info_len)
+{
+	/* TODO: support descriptor format */
+
+	sense_data_build(cmd, key, asc);
+	if (info_len) {
+		memcpy(cmd->sense_buffer + 2, info, 4);
+		cmd->sense_buffer[0] |= 0x80;
+	}
+}
+
 static inline uint32_t ssc_get_block_length(struct scsi_lu *lu)
 {
 	return get_unaligned_be24(lu->mode_block_descriptor + 5);
@@ -185,6 +197,8 @@ static int append_blk(struct scsi_cmd *cmd, uint8_t *data,
 	}
 	/* Write new EOD blk header */
 
+	fsync(fd);
+
 	free(curr);
 	return SAM_STAT_GOOD;
 
@@ -193,6 +207,8 @@ failed_write:
 	return SAM_STAT_CHECK_CONDITION;
 }
 
+#define SENSE_FILEMARK 0x80
+
 static int prev_filemark(struct scsi_cmd *cmd)
 {
 	struct ssc_info *ssc = dtype_priv(cmd->dev);
@@ -325,9 +341,12 @@ static int resp_fixed_read(struct scsi_cmd *cmd, uint8_t *buf, uint32_t length)
 
 	for (i = 0; i < count; i++) {
 		if (ssc->c_blk->blk_type == BLK_FILEMARK) {
+			uint8_t info[4];
+
 			eprintf("Oops - found filemark\n");
-			sense_data_build(cmd, NO_SENSE, ASC_MARK);
-/* FIXME: Need to update sense buffer with remaining byte count. */
+			put_unaligned_be32(count - i, info);
+			ssc_sense_data_build(cmd, NO_SENSE | SENSE_FILEMARK,
+					     ASC_MARK, info, sizeof(info));
 			goto rd_err;
 		}
 
diff --git a/usr/ssc.c b/usr/ssc.c
index 2d45eb2..834ec16 100644
--- a/usr/ssc.c
+++ b/usr/ssc.c
@@ -125,6 +125,9 @@ static int ssc_lu_init(struct scsi_lu *lu)
 
 	strncpy(lu->attrs.product_id, "VIRTUAL-TAPE",
 		sizeof(lu->attrs.product_id));
+
+	/* use only fixed for now */
+	lu->attrs.sense_format = 0;
 	lu->attrs.version_desc[0] = 0x0200; /* SSC no version claimed */
 	lu->attrs.version_desc[1] = 0x0960; /* iSCSI */
 	lu->attrs.version_desc[2] = 0x0300; /* SPC-3 */
-- 
1.5.6.5

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



More information about the stgt mailing list