Tomo, list, Please find attached a patch to SSC which changes when it performs fsync(). With this patch fsync will not be called for normal block writes but only for the final "write a filemark" that is issued when a full session writing to the tape has finished. The patch does improve performance significantly, especially on slow/low-end/dodgy hardware where fsync is expensive. As for data safety, I think this is ok. We dont guarantee that the data is all destaged to physical media until WRITE-FILEMARK command has completed successfully. Imho if the system crashes during the write session but before it has completed (==WRITE-FILEMARK) then all bets are off ? Maybe Mark and some of the other tape people can speak up if this is valid or dodgy reasoning? If so maybe I could add a attribute "buffered write = Yes|No" where fsync() on every write vs fsync() one the backup is complete can be controlled. Performance improvement is significant on slow hw! regards ronnie sahlberg
Attachment:
0001-SSC-dont-do-fsync-on-every-write-only-fsync-at-the-e.patch.gz
Description: GNU Zip compressed data
From b77200c7c9fc4805d2fa317a624e6f7c5090eb5f Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx> Date: Sat, 21 Jan 2012 16:39:34 +1100 Subject: [PATCH] SSC: dont do fsync() on every write, only fsync() at the end of the backup when we write a filemark Signed-off-by: Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx> --- usr/bs_ssc.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c index 469057d..f21509c 100644 --- a/usr/bs_ssc.c +++ b/usr/bs_ssc.c @@ -189,7 +189,8 @@ static int append_blk(struct scsi_cmd *cmd, uint8_t *data, } /* Write new EOD blk header */ - fsync(fd); + if (type == BLK_FILEMARK) + fsync(fd); return SAM_STAT_GOOD; } -- 1.7.3.1