>From 4d2dd49b86c057ccfd0cd818b7f0907a90c9a24a Mon Sep 17 00:00:00 2001
From: Ronnie Sahlberg <[EMAIL PROTECTED]>
Date: Fri, 2 May 2008 22:41:50 +1000
Subject: [PATCH 7/7] change how we handle dvdrecorder close track

dvdrecorder uses the reserve_track command before starting to write data.
pull the size of the full track from the cdb and store it in the mmc
structure.
once we see a write command where offset+length is equal to this track size
we consider the burning complete and morph the device into DVD-ROM

Signed-off-by: Ronnie Sahlberg <[EMAIL PROTECTED]>
---
 usr/mmc.c |   33 +++++++++++++++++++++++++--------
 1 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/usr/mmc.c b/usr/mmc.c
index d075b23..9e52845 100644
--- a/usr/mmc.c
+++ b/usr/mmc.c
@@ -54,6 +54,7 @@

 struct mmc_info {
        int current_profile;
+       uint64_t reserve_track_len;
 };

 static int mmc_rw(int host_no, struct scsi_cmd *cmd)
@@ -61,6 +62,7 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
        struct mmc_info *mmc = (struct mmc_info *)cmd->dev->mmc_p;
        int ret;
        uint64_t end_offset;
+       uint64_t offset, length;

        if (mmc->current_profile == PROFILE_NO_PROFILE) {
                scsi_set_in_resid_by_actual(cmd, 0);
@@ -97,11 +99,13 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)

        cmd->scsi_cmd_done = target_cmd_io_done;

-       cmd->offset = (scsi_rw_offset(cmd->scb) << MMC_BLK_SHIFT);
+       offset = scsi_rw_offset(cmd->scb);
+       cmd->offset = (offset << MMC_BLK_SHIFT);

        /* update the size of the device */
-       end_offset = cmd->offset +
-               (((uint64_t)scsi_rw_count(cmd->scb)) << MMC_BLK_SHIFT);
+       length = scsi_rw_count(cmd->scb);
+       end_offset = cmd->offset + (length << MMC_BLK_SHIFT);
+
        if (end_offset > cmd->dev->size)
                cmd->dev->size = end_offset;

@@ -116,10 +120,17 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
                sense_data_build(cmd, ILLEGAL_REQUEST, ASC_LUN_NOT_SUPPORTED);
                return SAM_STAT_CHECK_CONDITION;
        } else {
+               if ((mmc->current_profile == PROFILE_DVD_PLUS_R) &&
+                       (mmc->reserve_track_len == (offset + length))) {
+                       /* once we close the track it becomes a DVD_ROM */
+                       mmc->current_profile = PROFILE_DVD_ROM;
+               }
+
                set_cmd_mmapio(cmd);
                return SAM_STAT_GOOD;
        }

+
        return 0;
 }

@@ -1455,11 +1466,6 @@ static int mmc_synchronize_cache(int host_no,
struct scsi_cmd *cmd)
                return SAM_STAT_CHECK_CONDITION;
        }

-       if (mmc->current_profile == PROFILE_DVD_PLUS_R) {
-               /* once we close the track it becomes a DVD_ROM */
-               mmc->current_profile = PROFILE_DVD_ROM;
-       }
-
        return SAM_STAT_GOOD;
 }

@@ -2154,6 +2160,16 @@ static int mmc_read_dvd_structure(int host_no,
struct scsi_cmd *cmd)

 static int mmc_reserve_track(int host_no, struct scsi_cmd *cmd)
 {
+       struct mmc_info *mmc = (struct mmc_info *)cmd->dev->mmc_p;
+       uint64_t tmp;
+
+       tmp = cmd->scb[5];
+       tmp = (tmp << 8) | cmd->scb[6];
+       tmp = (tmp << 8) | cmd->scb[7];
+       tmp = (tmp << 8) | cmd->scb[8];
+
+       mmc->reserve_track_len = tmp;
+
        return SAM_STAT_GOOD;
 }

@@ -2247,6 +2263,7 @@ static int mmc_lu_online(struct scsi_lu *lu)
        struct stat st;

        mmc->current_profile = PROFILE_NO_PROFILE;
+       mmc->reserve_track_len = 0;

        if (lu->fd == -1)
                return TGTADM_INVALID_REQUEST;
-- 
1.5.5
_______________________________________________
Stgt-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/stgt-devel

Reply via email to