From 085451ada444e0bf556df6654983c417ba0eb931 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Fri, 4 Jun 2010 10:28:33 +0000 Subject: [PATCH] ORDERED commands processing cleanup: there's no need to issue flushes for each ORDERED command, because maintaining order of putting data into the cache is sufficient and expected from us. To issue cache flushes initiators supposed to use the cache flushing commands and bits. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1737 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/dev_handlers/scst_vdisk.c | 82 +----------------------------- usr/fileio/common.c | 51 +------------------ usr/fileio/common.h | 6 --- 3 files changed, 4 insertions(+), 135 deletions(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 962cced3e..e5d5c143a 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -226,15 +226,6 @@ struct scst_vdisk_dev { struct scst_dev_type *vdev_devt; }; -struct scst_vdisk_tgt_dev { - /* - * Used without locking since SCST core ensures that only commands - * with the same ORDERED type per tgt_dev can be processed - * simultaneously. - */ - enum scst_cmd_queue_type last_write_cmd_queue_type; -}; - struct scst_vdisk_thr { struct scst_thr_data_hdr hdr; struct file *fd; @@ -832,62 +823,26 @@ out_free: static int vdisk_attach_tgt(struct scst_tgt_dev *tgt_dev) { - struct scst_vdisk_tgt_dev *ftgt_dev; int res = 0; TRACE_ENTRY(); - ftgt_dev = kzalloc(sizeof(*ftgt_dev), GFP_KERNEL); - if (ftgt_dev == NULL) { - TRACE(TRACE_OUT_OF_MEM, "%s", "Allocation of per-session " - "virtual device failed"); - res = -ENOMEM; - goto out; - } + /* Nothing to do */ - tgt_dev->dh_priv = ftgt_dev; - -out: TRACE_EXIT_RES(res); return res; } static void vdisk_detach_tgt(struct scst_tgt_dev *tgt_dev) { - struct scst_vdisk_tgt_dev *ftgt_dev = - (struct scst_vdisk_tgt_dev *)tgt_dev->dh_priv; - TRACE_ENTRY(); scst_del_all_thr_data(tgt_dev); - kfree(ftgt_dev); - tgt_dev->dh_priv = NULL; - TRACE_EXIT(); return; } -static inline int vdisk_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 vdisk_need_pre_sync(enum scst_cmd_queue_type cur, - enum scst_cmd_queue_type last) -{ - if (vdisk_sync_queue_type(cur)) - if (!vdisk_sync_queue_type(last)) - return 1; - return 0; -} - static int vdisk_do_job(struct scst_cmd *cmd) { int rc, res; @@ -1038,28 +993,13 @@ static int vdisk_do_job(struct scst_cmd *cmd) case WRITE_12: case WRITE_16: { - int do_fsync = vdisk_sync_queue_type(cmd->queue_type); - struct scst_vdisk_tgt_dev *ftgt_dev = - (struct scst_vdisk_tgt_dev *)tgt_dev->dh_priv; - 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 (vdisk_need_pre_sync(cmd->queue_type, last_queue_type)) { - TRACE(TRACE_ORDER, "ORDERED WRITE(%d): loff=%lld, " - "data_len=%lld", cmd->queue_type, - (long long unsigned int)loff, - (long long unsigned int)data_len); - do_fsync = 1; - if (vdisk_fsync(thr, 0, 0, cmd, dev) != 0) - goto out_compl; - } if (virt_dev->blockio) { blockio_exec_rw(cmd, thr, lba_start, 1); goto out_thr; } else vdisk_exec_write(cmd, thr, loff); /* O_SYNC flag is used for WT devices */ - if (do_fsync || fua) + if (fua) vdisk_fsync(thr, loff, data_len, cmd, dev); break; } @@ -1067,29 +1007,11 @@ static int vdisk_do_job(struct scst_cmd *cmd) case WRITE_VERIFY_12: case WRITE_VERIFY_16: { - int do_fsync = vdisk_sync_queue_type(cmd->queue_type); - struct scst_vdisk_tgt_dev *ftgt_dev = - (struct scst_vdisk_tgt_dev *) tgt_dev->dh_priv; - 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 (vdisk_need_pre_sync(cmd->queue_type, last_queue_type)) { - TRACE(TRACE_ORDER, "ORDERED " - "WRITE_VERIFY(%d): loff=%lld," - " data_len=%lld", cmd->queue_type, - (long long unsigned int)loff, - (long long unsigned int)data_len); - do_fsync = 1; - if (vdisk_fsync(thr, 0, 0, cmd, dev) != 0) - goto out_compl; - } /* ToDo: BLOCKIO VERIFY */ vdisk_exec_write(cmd, thr, loff); /* O_SYNC flag is used for WT devices */ if (scsi_status_is_good(cmd->status)) vdisk_exec_verify(cmd, thr, loff); - else if (do_fsync) - vdisk_fsync(thr, loff, data_len, cmd, dev); break; } case SYNCHRONIZE_CACHE: diff --git a/usr/fileio/common.c b/usr/fileio/common.c index 4817cb205..51c5db5ab 100644 --- a/usr/fileio/common.c +++ b/usr/fileio/common.c @@ -227,26 +227,6 @@ struct vdisk_tgt_dev *find_empty_tgt_dev(struct vdisk_dev *dev) return res; } -static inline int 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 need_pre_sync(enum scst_cmd_queue_type cur, - enum scst_cmd_queue_type last) -{ - if (sync_queue_type(cur)) - if (!sync_queue_type(last)) - return 1; - return 0; -} - static int do_exec(struct vdisk_cmd *vcmd) { int res = 0; @@ -405,9 +385,7 @@ static int do_exec(struct vdisk_cmd *vcmd) case WRITE_12: case WRITE_16: if (!dev->rd_only_flag) { - int do_fsync = sync_queue_type(cmd->queue_type); struct vdisk_tgt_dev *tgt_dev; - enum scst_cmd_queue_type last_queue_type; tgt_dev = find_tgt_dev(dev, cmd->sess_h); if (tgt_dev == NULL) { @@ -418,20 +396,9 @@ static int do_exec(struct vdisk_cmd *vcmd) goto out; } - last_queue_type = tgt_dev->last_write_cmd_queue_type; - tgt_dev->last_write_cmd_queue_type = cmd->queue_type; - if (need_pre_sync(cmd->queue_type, last_queue_type)) { - TRACE(TRACE_ORDER, "ORDERED " - "WRITE(%d): loff=%"PRId64", data_len=%" - PRId64, cmd->queue_type, (uint64_t)loff, - (uint64_t)data_len); - do_fsync = 1; - if (exec_fsync(vcmd) != 0) - goto out; - } exec_write(vcmd, loff); /* O_SYNC flag is used for WT devices */ - if (do_fsync || fua) + if (fua) exec_fsync(vcmd); } else { PRINT_WARNING("Attempt to write to read-only " @@ -444,9 +411,7 @@ static int do_exec(struct vdisk_cmd *vcmd) case WRITE_VERIFY_12: case WRITE_VERIFY_16: if (!dev->rd_only_flag) { - int do_fsync = sync_queue_type(cmd->queue_type); struct vdisk_tgt_dev *tgt_dev; - enum scst_cmd_queue_type last_queue_type; tgt_dev = find_tgt_dev(dev, cmd->sess_h); if (tgt_dev == NULL) { @@ -457,22 +422,11 @@ static int do_exec(struct vdisk_cmd *vcmd) goto out; } - last_queue_type = tgt_dev->last_write_cmd_queue_type; - tgt_dev->last_write_cmd_queue_type = cmd->queue_type; - if (need_pre_sync(cmd->queue_type, last_queue_type)) { - TRACE(TRACE_ORDER, "ORDERED " - "WRITE_VERIFY(%d): loff=%"PRId64", " - "data_len=%"PRId64, cmd->queue_type, - (uint64_t)loff, (uint64_t)data_len); - do_fsync = 1; - if (exec_fsync(vcmd) != 0) - goto out; - } exec_write(vcmd, loff); /* O_SYNC flag is used for WT devices */ if (reply->status == 0) exec_verify(vcmd, loff); - else if (do_fsync) + else if (fua) exec_fsync(vcmd); } else { PRINT_WARNING("Attempt to write to read-only " @@ -712,7 +666,6 @@ static int do_sess(struct vdisk_cmd *vcmd) } tgt_dev->sess_h = cmd->sess.sess_h; - tgt_dev->last_write_cmd_queue_type = SCST_CMD_QUEUE_SIMPLE; PRINT_INFO("Session from initiator %s (target %s) attached " "(LUN %"PRIx64", threads_num %d, rd_only %d, sess_h " diff --git a/usr/fileio/common.h b/usr/fileio/common.h index 0ed313110..3acfdf966 100644 --- a/usr/fileio/common.h +++ b/usr/fileio/common.h @@ -46,12 +46,6 @@ struct vdisk_tgt_dev { uint64_t sess_h; - /* - * Used without protection since we are guaranteed by SCST core - * that only commands with the same ORDERED type per tgt_dev can - * be processed simultaneously. - */ - int last_write_cmd_queue_type; }; struct vdisk_dev {