Merge branch 'svn-trunk'

This commit is contained in:
Bart Van Assche
2015-09-28 21:04:57 -07:00
9 changed files with 99 additions and 22 deletions

View File

@@ -1039,9 +1039,7 @@ static void isert_device_release(struct isert_device *isert_dev)
err = ib_dereg_mr(isert_dev->mr);
if (unlikely(err))
pr_err("Failed to destroy mr, err:%d\n", err);
err = ib_dealloc_pd(isert_dev->pd);
if (unlikely(err))
pr_err("Failed to destroy pd, err:%d\n", err);
ib_dealloc_pd(isert_dev->pd);
vfree(isert_dev->cq_desc);
isert_dev->cq_desc = NULL;

View File

@@ -3,19 +3,19 @@
ABT_DETAILS="x86_64"
ABT_JOBS=5
ABT_KERNELS=" \
4.2 \
4.1.7-nc \
4.2.1 \
4.1.8-nc \
4.0.9-nc \
3.19.7-nc \
3.18.19-nc \
3.17.8-nc \
3.16.7-nc \
3.15.10-nc \
3.14.52-nc \
3.14.53-nc \
3.13.11-nc \
3.12.44-nc \
3.11.10-nc \
3.10.88-nc \
3.10.89-nc \
3.9.11-nc \
3.8.13-nc \
3.7.10-nc \

View File

@@ -1460,10 +1460,6 @@ information about how to associate iSCSI targets with a single physical
interface.
Notes:
- The ALUA specification allows but does not require that SCSI READ and WRITE
commands are rejected by ports that are not active. SCST processes READ and
WRITE commands unless these are received through a port that is in the
unavailable, transitioning or offline state.
- In a H.A. setup it is the responsibility of the user to synchronize ALUA
information between the individual systems running SCST. There are no
provisions in SCST to exchange ALUA information automatically between

View File

@@ -291,6 +291,7 @@ static inline int scst_sense_response_code(const uint8_t *sense)
/* NOT_READY is 2 */
#define scst_sense_format_in_progress NOT_READY, 0x04, 0x04
#define scst_sense_tp_transitioning NOT_READY, 0x04, 0x0A
#define scst_sense_tp_standby NOT_READY, 0x04, 0x0B
#define scst_sense_tp_unav NOT_READY, 0x04, 0x0C
#define scst_sense_no_medium NOT_READY, 0x3a, 0

View File

@@ -6214,10 +6214,15 @@ static void blockio_bio_destructor(struct bio *bio)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
static int blockio_endio(struct bio *bio, unsigned int bytes_done, int error)
#else
static void blockio_endio(struct bio *bio, int error)
#endif
{
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
static void blockio_endio(struct bio *bio, int error)
{
#else
static void blockio_endio(struct bio *bio)
{
int error = bio->bi_error;
#endif
struct scst_blockio_work *blockio_work = bio->bi_private;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@@ -6225,6 +6230,7 @@ static void blockio_endio(struct bio *bio, int error)
return 1;
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
if (unlikely(!bio_flagged(bio, BIO_UPTODATE))) {
if (error == 0) {
PRINT_ERROR("Not up to date bio with error 0 for "
@@ -6232,6 +6238,7 @@ static void blockio_endio(struct bio *bio, int error)
error = -EIO;
}
}
#endif
if (unlikely(error != 0)) {
unsigned long flags;
@@ -6482,7 +6489,11 @@ static void blockio_exec_rw(struct vdisk_cmd_params *p, bool write, bool fua)
#endif
if (q)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
max_nr_vecs = BIO_MAX_PAGES;
#else
max_nr_vecs = min(bio_get_nr_vecs(bdev), BIO_MAX_PAGES);
#endif
else
max_nr_vecs = 1;
@@ -6651,8 +6662,14 @@ finish_cmd:
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
static void vdev_flush_end_io(struct bio *bio, int error)
{
#else
static void vdev_flush_end_io(struct bio *bio)
{
int error = bio->bi_error;
#endif
struct scst_cmd *cmd = bio->bi_private;
TRACE_ENTRY();
@@ -6753,10 +6770,15 @@ static void blockio_bio_destructor_sync(struct bio *bio)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
static int blockio_end_sync_io(struct bio *bio, unsigned int bytes_done,
int error)
#else
static void blockio_end_sync_io(struct bio *bio, int error)
#endif
{
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
static void blockio_end_sync_io(struct bio *bio, int error)
{
#else
static void blockio_end_sync_io(struct bio *bio)
{
int error = bio->bi_error;
#endif
struct bio_priv_sync *s = bio->bi_private;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@@ -6764,10 +6786,12 @@ static void blockio_end_sync_io(struct bio *bio, int error)
return 1;
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
if (!bio_flagged(bio, BIO_UPTODATE) && error == 0) {
PRINT_ERROR("Not up to date bio with error 0; returning -EIO");
error = -EIO;
}
#endif
s->error = error;
complete(&s->c);
@@ -6812,7 +6836,11 @@ static ssize_t blockio_rw_sync(struct scst_vdisk_dev *virt_dev, void *buf,
bool submitted = false;
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)
max_nr_vecs = BIO_MAX_PAGES;
#else
max_nr_vecs = min(bio_get_nr_vecs(bdev), BIO_MAX_PAGES);
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
bio = bio_alloc_bioset(GFP_KERNEL, max_nr_vecs, virt_dev->vdisk_bioset);

View File

@@ -7030,8 +7030,14 @@ static void blk_free_kern_sg_work(struct blk_kern_sg_work *bw)
return;
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
static void blk_bio_map_kern_endio(struct bio *bio, int err)
{
#else
static void blk_bio_map_kern_endio(struct bio *bio)
{
int err = bio->bi_error;
#endif
struct blk_kern_sg_work *bw = bio->bi_private;
if (bw != NULL) {
@@ -7645,7 +7651,12 @@ out_free_unmap:
while (bio) {
b = bio;
bio = bio->bi_next;
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
b->bi_end_io(b, res);
#else
b->bi_error = res;
b->bi_end_io(b);
#endif
}
}
rq->bio = NULL;

View File

@@ -267,6 +267,12 @@ static bool scst_tg_accept(struct scst_cmd *cmd)
case READ_CAPACITY:
case REPORT_LUNS:
case REQUEST_SENSE:
case RELEASE:
case RELEASE_10:
case RESERVE:
case RESERVE_10:
case READ_BUFFER:
case WRITE_BUFFER:
return true;
case SERVICE_ACTION_IN_16:
switch (cmd->cdb[1] & 0x1f) {
@@ -291,6 +297,34 @@ static bool scst_tg_accept(struct scst_cmd *cmd)
return false;
}
/*
* Whether or not to accept a command in the ALUA standby state.
*/
static bool scst_tg_accept_standby(struct scst_cmd *cmd)
{
bool process_cmd = scst_tg_accept(cmd);
if (process_cmd)
return process_cmd;
switch (cmd->cdb[0]) {
case MODE_SELECT:
case MODE_SELECT_10:
case LOG_SELECT:
case LOG_SENSE:
case RECEIVE_DIAGNOSTIC:
case SEND_DIAGNOSTIC:
case PERSISTENT_RESERVE_IN:
case PERSISTENT_RESERVE_OUT:
return true;
}
scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_tp_standby));
return false;
}
/*
* Whether or not to accept a command in the ALUA unavailable state.
*/
@@ -321,7 +355,7 @@ static bool scst_tg_accept_transitioning(struct scst_cmd *cmd)
static bool (*scst_alua_filter[])(struct scst_cmd *cmd) = {
[SCST_TG_STATE_OPTIMIZED] = NULL,
[SCST_TG_STATE_NONOPTIMIZED] = NULL,
[SCST_TG_STATE_STANDBY] = NULL,
[SCST_TG_STATE_STANDBY] = scst_tg_accept_standby,
[SCST_TG_STATE_UNAVAILABLE] = scst_tg_accept_unav,
[SCST_TG_STATE_LBA_DEPENDENT] = NULL,
[SCST_TG_STATE_OFFLINE] = scst_tg_accept_unav,

View File

@@ -4202,8 +4202,11 @@ static void srpt_add_one(struct ib_device *device)
* in the system as service_id; therefore, the target_id will change
* if this HCA is gone bad and replaced by different HCA
*/
ret = ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid), 0,
NULL);
ret = ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid), 0
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
, NULL
#endif
);
if (ret) {
pr_err("ib_cm_listen() failed: %d (cm_id state = %d)\n", ret,
sdev->cm_id->state);
@@ -4277,12 +4280,18 @@ err:
/**
* srpt_remove_one() - InfiniBand device removal callback function.
*/
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
static void srpt_remove_one(struct ib_device *device)
{
void *client_data = ib_get_client_data(device, &srpt_client);
#else
static void srpt_remove_one(struct ib_device *device, void *client_data)
{
#endif
struct srpt_device *sdev;
int i;
sdev = ib_get_client_data(device, &srpt_client);
sdev = client_data;
if (!sdev) {
pr_info("%s(%s): nothing to do.\n", __func__, device->name);
return;

View File

@@ -702,7 +702,7 @@ void *main_loop(void *arg)
struct vdisk_cmd vcmd = { -1, &cmd, dev, &reply, {0}};
int scst_usr_fd = dev->scst_usr_fd;
struct pollfd pl;
#define MULTI_CMDS_CNT 128
#define MULTI_CMDS_CNT 2
struct {
struct scst_user_reply_cmd replies[MULTI_CMDS_CNT];
struct scst_user_get_multi multi_cmd;