mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-14 09:11:27 +00:00
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
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user