mirror of
https://github.com/SCST-project/scst.git
synced 2026-08-19 21:56:31 +00:00
Merged revisions 5785-5786,5793-5796,5798,5801-5802,5804-5806,5808,5810-5811,5814,5816-5817 via svnmerge from
svn+ssh://yanb123@svn.code.sf.net/p/scst/svn/trunk
........
r5785 | bvassche | 2014-09-09 14:09:20 +0300 (Tue, 09 Sep 2014) | 9 lines
scst_local: Change max_lun into SCST_MAX_LUN (16383)
Today SCST does not support LUN numbers >= 16384. Additionally,
there is a bug in older Linux initiator systems that prevents
proper handling of LUN numbers >= 2**32. See also Hannes Reinecke,
scsi_scan: Fixup scsilun_to_int(), June 25, 2014 (commit ID
d9e5d6183715e691b37afd3785c311d05cd1338d). Hence set max_lun to
16383.
........
r5786 | bvassche | 2014-09-09 14:27:27 +0300 (Tue, 09 Sep 2014) | 6 lines
scst_local: Set max_id to 1
The value 0 is not valid for the max_id member of struct Scsi_Host.
Signed-off-by: Sebastian Herbszt <herbszt@gmx.de>
........
r5793 | bvassche | 2014-09-10 14:42:54 +0300 (Wed, 10 Sep 2014) | 1 line
scstadmin: Sync saved configuration files
........
r5794 | bvassche | 2014-09-10 14:44:14 +0300 (Wed, 10 Sep 2014) | 2 lines
scstadmin test 06-cont-on-err.t: Filter out scstadmin version number
........
r5795 | bvassche | 2014-09-10 15:18:09 +0300 (Wed, 10 Sep 2014) | 1 line
ib_srpt: Add max_sge_delta kernel module parameter
........
r5796 | bvassche | 2014-09-10 15:20:30 +0300 (Wed, 10 Sep 2014) | 1 line
ib_srpt: Update Subversion ignore lists
........
r5798 | bvassche | 2014-09-12 14:16:35 +0300 (Fri, 12 Sep 2014) | 1 line
fcst/Makefile: Add release-archive target
........
r5801 | bvassche | 2014-09-12 14:20:16 +0300 (Fri, 12 Sep 2014) | 1 line
fcst: Change version number from 0.3 into 3.1.0-pre
........
r5802 | vlnb | 2014-09-13 04:13:29 +0300 (Sat, 13 Sep 2014) | 3 lines
Fix autofinding SCST headers in fileio_tgt
........
r5804 | vlnb | 2014-09-13 04:35:12 +0300 (Sat, 13 Sep 2014) | 3 lines
Web updates
........
r5805 | vlnb | 2014-09-13 04:37:12 +0300 (Sat, 13 Sep 2014) | 3 lines
Update root README to use symlink instead of bind mount for QLogic git driver integration
........
r5806 | bvassche | 2014-09-15 15:30:43 +0300 (Mon, 15 Sep 2014) | 1 line
ib_srpt: Make "make -j<n> install" work for n >= 2 if "make all" has not been run first
........
r5808 | bvassche | 2014-09-16 14:06:00 +0300 (Tue, 16 Sep 2014) | 6 lines
scst/src/Makefile: Make "make install" without prior "make" work
Avoid that MOD_VERS and MODS_VERS evaluate to an empty string.
Reported-by: Yan Burman <yanb@mellanox.com>
........
r5810 | bvassche | 2014-09-17 13:54:25 +0300 (Wed, 17 Sep 2014) | 1 line
scst_vdisk: Insert a blank line
........
r5811 | bvassche | 2014-09-17 13:56:40 +0300 (Wed, 17 Sep 2014) | 14 lines
vdisk_blockio: Make large COMPARE AND WRITE requests work for stacked block devices
Stacked block devices impose weird restrictions on S/G-lists. Hence
make the COMPARE AND WRITE implementation independent of these
restrictions.
Additionally, reduce the MAXIMUM COMPARE AND WRITE LENGTH limit from
0xff (no limit) to 0xfe to reduce the maximum amount of memory allocated
during a COMPARE AND WRITE. Also serialize COMPARE AND WRITE
operations, fix the offset reported for miscompares and fix the start
offset of the region that is synchronized if the FUA bit has been set.
Reported-by: Vishal Tripathi <vishal.tripathi@calsoftinc.com>
........
r5814 | bvassche | 2014-09-18 10:08:49 +0300 (Thu, 18 Sep 2014) | 1 line
nightly build: Update kernel versions
........
r5816 | vlnb | 2014-09-20 09:31:43 +0300 (Sat, 20 Sep 2014) | 3 lines
Web updates
........
r5817 | bvassche | 2014-09-28 21:54:04 +0200 (Sun, 28 Sep 2014) | 1 line
scripts/rebuild-rhel-kernel-rpm: Enable put_page_callback patch for RHEL 7
........
git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/iser@5819 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
+6
-11
@@ -95,9 +95,10 @@ all: $(SCST_INTF_VER_FILE)
|
||||
scst:
|
||||
$(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) BUILD_DEV=n
|
||||
|
||||
MODS_VERS := $(shell ls Modules.symvers 2>/dev/null)
|
||||
# It's renamed in 2.6.18
|
||||
MOD_VERS := $(shell ls Module.symvers 2>/dev/null)
|
||||
# The file Modules.symvers has been renamed in the 2.6.18 kernel to
|
||||
# Module.symvers. Find out which name to use by looking in $(KDIR).
|
||||
MODULE_SYMVERS:=$(shell if [ -e $(KDIR)/Module.symvers ]; then \
|
||||
echo Module.symvers; else echo Modules.symvers; fi)
|
||||
|
||||
install: all
|
||||
@if [ -z "$(DESTDIR)" ] && \
|
||||
@@ -116,14 +117,8 @@ install: all
|
||||
install -m 644 ../include/scst_user.h $(INSTALL_DIR_H)
|
||||
install -m 644 ../include/scst_const.h $(INSTALL_DIR_H)
|
||||
install -m 644 ../include/scst_itf_ver.h $(INSTALL_DIR_H)
|
||||
ifneq ($(MODS_VERS),)
|
||||
rm -f $(INSTALL_DIR_H)/Module.symvers
|
||||
install -m 644 Modules.symvers $(INSTALL_DIR_H)
|
||||
endif
|
||||
ifneq ($(MOD_VERS),)
|
||||
rm -f $(INSTALL_DIR_H)/Modules.symvers
|
||||
install -m 644 Module.symvers $(INSTALL_DIR_H)
|
||||
endif
|
||||
rm -f $(INSTALL_DIR_H)/$(MODULE_SYMVERS)
|
||||
install -m 644 $(MODULE_SYMVERS) $(INSTALL_DIR_H)
|
||||
-/sbin/depmod -b $(INSTALL_MOD_PATH)/ -a $(KVER)
|
||||
mkdir -p $(DESTDIR)/var/lib/scst/pr
|
||||
mkdir -p $(DESTDIR)/var/lib/scst/vdev_mode_pages
|
||||
|
||||
@@ -119,6 +119,9 @@ static struct scst_trace_log vdisk_local_trace_tbl[] = {
|
||||
#define DEF_TST SCST_TST_1_SEP_TASK_SETS
|
||||
#define DEF_TMF_ONLY 0
|
||||
|
||||
#define NO_CAW_LEN_LIM 0xff
|
||||
#define DEF_CAW_LEN_LIM 0xfe
|
||||
|
||||
/*
|
||||
* Since we can't control backstorage device's reordering, we have to always
|
||||
* report unrestricted reordering.
|
||||
@@ -213,6 +216,10 @@ struct scst_vdisk_dev {
|
||||
/* Unmap INQUIRY parameters */
|
||||
uint32_t unmap_opt_gran, unmap_align, unmap_max_lba_cnt;
|
||||
|
||||
/* Block limits INQUIRY parameters */
|
||||
uint8_t caw_len_lim;
|
||||
struct mutex caw_mutex;
|
||||
|
||||
struct scst_device *dev;
|
||||
struct list_head vdev_list_entry;
|
||||
|
||||
@@ -3464,7 +3471,7 @@ static int vdisk_block_limits(uint8_t *buf, struct scst_cmd *cmd,
|
||||
buf[1] = 0xB0;
|
||||
buf[3] = 0x3C;
|
||||
buf[4] = 1; /* WSNZ set */
|
||||
buf[5] = 0xFF; /* No MAXIMUM COMPARE AND WRITE LENGTH limit */
|
||||
buf[5] = virt_dev->caw_len_lim;
|
||||
/* Optimal transfer granuality is PAGE_SIZE */
|
||||
put_unaligned_be16(max_t(int, PAGE_SIZE / dev->block_size, 1), &buf[6]);
|
||||
|
||||
@@ -5593,6 +5600,17 @@ static void blockio_end_sync_io(struct bio *bio, int error)
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* blockio_rw_sync() - read or write up to @len bytes from a block I/O device
|
||||
*
|
||||
* Returns:
|
||||
* - A negative value if an error occurred.
|
||||
* - Zero if len == 0.
|
||||
* - A positive value <= len if I/O succeeded.
|
||||
*
|
||||
* Note:
|
||||
* Increments *@loff with the number of bytes transferred upon success.
|
||||
*/
|
||||
static ssize_t blockio_rw_sync(struct scst_vdisk_dev *virt_dev, void *buf,
|
||||
size_t len, loff_t *loff, unsigned rw)
|
||||
{
|
||||
@@ -5643,15 +5661,26 @@ static ssize_t blockio_rw_sync(struct scst_vdisk_dev *virt_dev, void *buf,
|
||||
bytes = min_t(size_t, PAGE_SIZE - off, buf + len - p);
|
||||
q = is_vmalloc ? vmalloc_to_page(p) : virt_to_page(p);
|
||||
rc = bio_add_page(bio, q, bytes, off);
|
||||
if (WARN_ON_ONCE(rc < bytes))
|
||||
goto free;
|
||||
if (rc < bytes) {
|
||||
if (rc <= 0 && p == buf) {
|
||||
goto free;
|
||||
} else {
|
||||
if (rc > 0)
|
||||
p += rc;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
submit_bio(rw, bio);
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) && (LINUX_VERSION_CODE <= KERNEL_VERSION(3, 6, 0))
|
||||
submitted = true;
|
||||
#endif
|
||||
wait_for_completion(&s.c);
|
||||
ret = (unsigned long)s.error ? : len;
|
||||
ret = (unsigned long)s.error;
|
||||
if (likely(ret == 0)) {
|
||||
ret = p - buf;
|
||||
*loff += ret;
|
||||
}
|
||||
|
||||
free:
|
||||
bio_put(bio);
|
||||
@@ -5664,6 +5693,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Note: Updates *@loff if reading succeeded. */
|
||||
static ssize_t fileio_read_sync(struct file *fd, void *buf, size_t len,
|
||||
loff_t *loff)
|
||||
{
|
||||
@@ -5688,6 +5718,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Note: Updates *@loff if writing succeeded. */
|
||||
static ssize_t fileio_write_sync(struct file *fd, void *buf, size_t len,
|
||||
loff_t *loff)
|
||||
{
|
||||
@@ -5711,26 +5742,47 @@ out:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Note: Updates *@loff if reading succeeded except for NULLIO devices. */
|
||||
static ssize_t vdev_read_sync(struct scst_vdisk_dev *virt_dev, void *buf,
|
||||
size_t len, loff_t *loff)
|
||||
{
|
||||
if (virt_dev->nullio)
|
||||
ssize_t read, res;
|
||||
|
||||
if (virt_dev->nullio) {
|
||||
return len;
|
||||
else if (virt_dev->blockio)
|
||||
return blockio_rw_sync(virt_dev, buf, len, loff, READ_SYNC);
|
||||
else
|
||||
} else if (virt_dev->blockio) {
|
||||
for (read = 0; read < len; read += res) {
|
||||
res = blockio_rw_sync(virt_dev, buf + read, len - read,
|
||||
loff, READ_SYNC);
|
||||
if (res < 0)
|
||||
return res;
|
||||
}
|
||||
return read;
|
||||
} else {
|
||||
return fileio_read_sync(virt_dev->fd, buf, len, loff);
|
||||
}
|
||||
}
|
||||
|
||||
/* Note: Updates *@loff if reading succeeded except for NULLIO devices. */
|
||||
static ssize_t vdev_write_sync(struct scst_vdisk_dev *virt_dev, void *buf,
|
||||
size_t len, loff_t *loff)
|
||||
{
|
||||
if (virt_dev->nullio)
|
||||
ssize_t written, res;
|
||||
|
||||
if (virt_dev->nullio) {
|
||||
return len;
|
||||
else if (virt_dev->blockio)
|
||||
return blockio_rw_sync(virt_dev, buf, len, loff, WRITE_SYNC);
|
||||
else
|
||||
} else if (virt_dev->blockio) {
|
||||
for (written = 0; written < len; written += res) {
|
||||
res = blockio_rw_sync(virt_dev, buf + written,
|
||||
len - written, loff, WRITE_SYNC);
|
||||
if (res < 0)
|
||||
return res;
|
||||
}
|
||||
return written;
|
||||
} else {
|
||||
return fileio_write_sync(virt_dev->fd, buf, len, loff);
|
||||
}
|
||||
}
|
||||
|
||||
static enum compl_status_e vdev_exec_verify(struct vdisk_cmd_params *p)
|
||||
@@ -5855,6 +5907,16 @@ static enum compl_status_e vdisk_exec_caw(struct vdisk_cmd_params *p)
|
||||
if (data_len == 0)
|
||||
goto out;
|
||||
|
||||
if (virt_dev->caw_len_lim != NO_CAW_LEN_LIM &&
|
||||
(data_len > virt_dev->caw_len_lim << dev->block_shift)) {
|
||||
PRINT_ERROR("COMPARE AND WRITE: data length %u exceeds"
|
||||
" limit %u << %u = %u", data_len,
|
||||
virt_dev->caw_len_lim, dev->block_shift,
|
||||
virt_dev->caw_len_lim << dev->block_shift);
|
||||
scst_set_invalid_field_in_cdb(cmd, 13, 0);
|
||||
goto out;
|
||||
}
|
||||
|
||||
length = scst_get_buf_full(cmd, &caw_buf);
|
||||
read_buf = vmalloc(data_len);
|
||||
if (length < 0 || !read_buf) {
|
||||
@@ -5872,6 +5934,8 @@ static enum compl_status_e vdisk_exec_caw(struct vdisk_cmd_params *p)
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&virt_dev->caw_mutex);
|
||||
|
||||
loff = p->loff;
|
||||
read = vdev_read_sync(virt_dev, read_buf, data_len, &loff);
|
||||
if (read < data_len) {
|
||||
@@ -5882,7 +5946,7 @@ static enum compl_status_e vdisk_exec_caw(struct vdisk_cmd_params *p)
|
||||
else
|
||||
scst_set_cmd_error(cmd,
|
||||
SCST_LOAD_SENSE(scst_sense_read_error));
|
||||
goto out;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (memcmp(caw_buf, read_buf, data_len) != 0) {
|
||||
@@ -5899,9 +5963,8 @@ static enum compl_status_e vdisk_exec_caw(struct vdisk_cmd_params *p)
|
||||
* INFORMATION field.
|
||||
*/
|
||||
scst_set_cmd_error_and_inf(cmd,
|
||||
SCST_LOAD_SENSE(scst_sense_miscompare_error),
|
||||
p->loff + i);
|
||||
goto out;
|
||||
SCST_LOAD_SENSE(scst_sense_miscompare_error), i);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
loff = p->loff;
|
||||
@@ -5915,12 +5978,15 @@ static enum compl_status_e vdisk_exec_caw(struct vdisk_cmd_params *p)
|
||||
else
|
||||
scst_set_cmd_error(cmd,
|
||||
SCST_LOAD_SENSE(scst_sense_write_error));
|
||||
goto out;
|
||||
goto unlock;
|
||||
}
|
||||
if (p->fua)
|
||||
vdisk_fsync(loff, scst_cmd_get_data_len(cmd), cmd->dev,
|
||||
vdisk_fsync(p->loff, scst_cmd_get_data_len(cmd), cmd->dev,
|
||||
cmd->cmd_gfp_mask, cmd, false);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&virt_dev->caw_mutex);
|
||||
|
||||
out:
|
||||
if (read_buf)
|
||||
vfree(read_buf);
|
||||
@@ -6154,6 +6220,8 @@ static int vdev_create(struct scst_dev_type *devt,
|
||||
}
|
||||
|
||||
spin_lock_init(&virt_dev->flags_lock);
|
||||
mutex_init(&virt_dev->caw_mutex);
|
||||
|
||||
virt_dev->vdev_devt = devt;
|
||||
|
||||
virt_dev->rd_only = DEF_RD_ONLY;
|
||||
@@ -6163,6 +6231,7 @@ static int vdev_create(struct scst_dev_type *devt,
|
||||
virt_dev->rotational = DEF_ROTATIONAL;
|
||||
virt_dev->thin_provisioned = DEF_THIN_PROVISIONED;
|
||||
virt_dev->tst = DEF_TST;
|
||||
virt_dev->caw_len_lim = DEF_CAW_LEN_LIM;
|
||||
|
||||
virt_dev->blk_shift = DEF_DISK_BLOCK_SHIFT;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user