From: <vl...@us...> - 2006-10-27 10:44:07
|
Revision: 19 http://svn.sourceforge.net/scst/?rev=19&view=rev Author: vlnb Date: 2006-10-27 03:43:58 -0700 (Fri, 27 Oct 2006) Log Message: ----------- Small ORDERED commands handling optimization Modified Paths: -------------- trunk/scst/src/dev_handlers/scst_fileio.c Modified: trunk/scst/src/dev_handlers/scst_fileio.c =================================================================== --- trunk/scst/src/dev_handlers/scst_fileio.c 2006-10-27 09:45:12 UTC (rev 18) +++ trunk/scst/src/dev_handlers/scst_fileio.c 2006-10-27 10:43:58 UTC (rev 19) @@ -105,6 +105,7 @@ struct scst_fileio_tgt_dev { spinlock_t fdev_lock; + enum scst_cmd_queue_type last_write_cmd_queue_type; int shutdown; struct file *fd; struct iovec *iv; @@ -380,6 +381,26 @@ return; } +static inline int fileio_sync_queue_type(enum scst_cmd_queue_type qt) +{ + switch(qt) { + case SCST_CMD_QUEUE_ORDERED: + case SCST_CMD_QUEUE_HEAD_OF_QUEUE: + return 1; + default: + return 0; + } +} + +static inline int fileio_need_pre_sync(enum scst_cmd_queue_type cwqt, + enum scst_cmd_queue_type lwqt) +{ + if (fileio_sync_queue_type(cwqt)) + if (!fileio_sync_queue_type(lwqt)) + return 1; + return 0; +} + static void fileio_do_job(struct scst_cmd *cmd) { uint64_t lba_start; @@ -482,11 +503,15 @@ struct scst_fileio_tgt_dev *ftgt_dev = (struct scst_fileio_tgt_dev*) cmd->tgt_dev->dh_priv; - if ((cmd->queue_type == SCST_CMD_QUEUE_ORDERED) && + enum scst_cmd_queue_type last_queue_type = + ftgt_dev->last_write_cmd_queue_type; + ftgt_dev->last_write_cmd_queue_type = cmd->queue_type; + if (fileio_need_pre_sync(cmd->queue_type, last_queue_type) && !virt_dev->wt_flag) { - TRACE(TRACE_SCSI/*|TRACE_SPECIAL*/, "ORDERED WRITE: " - "loff=%Ld, data_len=%Ld", (uint64_t)loff, - (uint64_t)data_len); + TRACE(TRACE_SCSI/*|TRACE_SPECIAL*/, "ORDERED " + "WRITE(%d): loff=%Ld, data_len=%Ld", + cmd->queue_type, (uint64_t)loff, + (uint64_t)data_len); do_fsync = 1; if (fileio_fsync(ftgt_dev, 0, 0, cmd) != 0) goto done; @@ -509,11 +534,15 @@ struct scst_fileio_tgt_dev *ftgt_dev = (struct scst_fileio_tgt_dev*) cmd->tgt_dev->dh_priv; - if ((cmd->queue_type == SCST_CMD_QUEUE_ORDERED) && + enum scst_cmd_queue_type last_queue_type = + ftgt_dev->last_write_cmd_queue_type; + ftgt_dev->last_write_cmd_queue_type = cmd->queue_type; + if (fileio_need_pre_sync(cmd->queue_type, last_queue_type) && !virt_dev->wt_flag) { TRACE(TRACE_SCSI/*|TRACE_SPECIAL*/, "ORDERED " - "WRITE_VERIFY: loff=%Ld, data_len=%Ld", - (uint64_t)loff, (uint64_t)data_len); + "WRITE_VERIFY(%d): loff=%Ld, data_len=%Ld", + cmd->queue_type, (uint64_t)loff, + (uint64_t)data_len); do_fsync = 1; if (fileio_fsync(ftgt_dev, 0, 0, cmd) != 0) goto done; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |