diff options
Diffstat (limited to 'drivers/scsi/st.c')
| -rw-r--r-- | drivers/scsi/st.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 4684cc716aa4..c2bb53e3d941 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support | 17 | Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | static const char *verstr = "20080224"; | 20 | static const char *verstr = "20080504"; |
| 21 | 21 | ||
| 22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 23 | 23 | ||
| @@ -631,7 +631,7 @@ static int cross_eof(struct scsi_tape * STp, int forward) | |||
| 631 | /* Flush the write buffer (never need to write if variable blocksize). */ | 631 | /* Flush the write buffer (never need to write if variable blocksize). */ |
| 632 | static int st_flush_write_buffer(struct scsi_tape * STp) | 632 | static int st_flush_write_buffer(struct scsi_tape * STp) |
| 633 | { | 633 | { |
| 634 | int offset, transfer, blks; | 634 | int transfer, blks; |
| 635 | int result; | 635 | int result; |
| 636 | unsigned char cmd[MAX_COMMAND_SIZE]; | 636 | unsigned char cmd[MAX_COMMAND_SIZE]; |
| 637 | struct st_request *SRpnt; | 637 | struct st_request *SRpnt; |
| @@ -644,14 +644,10 @@ static int st_flush_write_buffer(struct scsi_tape * STp) | |||
| 644 | result = 0; | 644 | result = 0; |
| 645 | if (STp->dirty == 1) { | 645 | if (STp->dirty == 1) { |
| 646 | 646 | ||
| 647 | offset = (STp->buffer)->buffer_bytes; | 647 | transfer = STp->buffer->buffer_bytes; |
| 648 | transfer = ((offset + STp->block_size - 1) / | ||
| 649 | STp->block_size) * STp->block_size; | ||
| 650 | DEBC(printk(ST_DEB_MSG "%s: Flushing %d bytes.\n", | 648 | DEBC(printk(ST_DEB_MSG "%s: Flushing %d bytes.\n", |
| 651 | tape_name(STp), transfer)); | 649 | tape_name(STp), transfer)); |
| 652 | 650 | ||
| 653 | memset((STp->buffer)->b_data + offset, 0, transfer - offset); | ||
| 654 | |||
| 655 | memset(cmd, 0, MAX_COMMAND_SIZE); | 651 | memset(cmd, 0, MAX_COMMAND_SIZE); |
| 656 | cmd[0] = WRITE_6; | 652 | cmd[0] = WRITE_6; |
| 657 | cmd[1] = 1; | 653 | cmd[1] = 1; |
| @@ -1670,6 +1666,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) | |||
| 1670 | if (undone <= do_count) { | 1666 | if (undone <= do_count) { |
| 1671 | /* Only data from this write is not written */ | 1667 | /* Only data from this write is not written */ |
| 1672 | count += undone; | 1668 | count += undone; |
| 1669 | b_point -= undone; | ||
| 1673 | do_count -= undone; | 1670 | do_count -= undone; |
| 1674 | if (STp->block_size) | 1671 | if (STp->block_size) |
| 1675 | blks = (transfer - undone) / STp->block_size; | 1672 | blks = (transfer - undone) / STp->block_size; |
