Commit 2a8f7a03 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen
Browse files

scsi: scsi_dh: Return SCSI_DH_XX error code from ->attach()



Rather than having each device handler implementing their own error
mapping, have the ->attach() call return a SCSI_DH_XXX error code and
implement the mapping in scsi_dh_handler_attach().

Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent b7af62a9
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -1085,11 +1085,11 @@ static void alua_rescan(struct scsi_device *sdev)
static int alua_bus_attach(struct scsi_device *sdev)
{
	struct alua_dh_data *h;
	int err, ret = -EINVAL;
	int err;

	h = kzalloc(sizeof(*h) , GFP_KERNEL);
	if (!h)
		return -ENOMEM;
		return SCSI_DH_NOMEM;
	spin_lock_init(&h->pg_lock);
	rcu_assign_pointer(h->pg, NULL);
	h->init_error = SCSI_DH_OK;
@@ -1098,16 +1098,14 @@ static int alua_bus_attach(struct scsi_device *sdev)

	mutex_init(&h->init_mutex);
	err = alua_initialize(sdev, h);
	if (err == SCSI_DH_NOMEM)
		ret = -ENOMEM;
	if (err != SCSI_DH_OK && err != SCSI_DH_DEV_OFFLINED)
		goto failed;

	sdev->handler_data = h;
	return 0;
	return SCSI_DH_OK;
failed:
	kfree(h);
	return ret;
	return err;
}

/*
+3 −3
Original line number Diff line number Diff line
@@ -490,7 +490,7 @@ static int clariion_bus_attach(struct scsi_device *sdev)

	h = kzalloc(sizeof(*h) , GFP_KERNEL);
	if (!h)
		return -ENOMEM;
		return SCSI_DH_NOMEM;
	h->lun_state = CLARIION_LUN_UNINITIALIZED;
	h->default_sp = CLARIION_UNBOUND_LU;
	h->current_sp = CLARIION_UNBOUND_LU;
@@ -510,11 +510,11 @@ static int clariion_bus_attach(struct scsi_device *sdev)
		    h->default_sp + 'A');

	sdev->handler_data = h;
	return 0;
	return SCSI_DH_OK;

failed:
	kfree(h);
	return -EINVAL;
	return err;
}

static void clariion_bus_detach(struct scsi_device *sdev)
+8 −4
Original line number Diff line number Diff line
@@ -218,24 +218,28 @@ static int hp_sw_bus_attach(struct scsi_device *sdev)

	h = kzalloc(sizeof(*h), GFP_KERNEL);
	if (!h)
		return -ENOMEM;
		return SCSI_DH_NOMEM;
	h->path_state = HP_SW_PATH_UNINITIALIZED;
	h->retries = HP_SW_RETRIES;
	h->sdev = sdev;

	ret = hp_sw_tur(sdev, h);
	if (ret != SCSI_DH_OK || h->path_state == HP_SW_PATH_UNINITIALIZED)
	if (ret != SCSI_DH_OK)
		goto failed;
	if (h->path_state == HP_SW_PATH_UNINITIALIZED) {
		ret = SCSI_DH_NOSYS;
		goto failed;
	}

	sdev_printk(KERN_INFO, sdev, "%s: attached to %s path\n",
		    HP_SW_NAME, h->path_state == HP_SW_PATH_ACTIVE?
		    "active":"passive");

	sdev->handler_data = h;
	return 0;
	return SCSI_DH_OK;
failed:
	kfree(h);
	return -EINVAL;
	return ret;
}

static void hp_sw_bus_detach( struct scsi_device *sdev )
+3 −3
Original line number Diff line number Diff line
@@ -729,7 +729,7 @@ static int rdac_bus_attach(struct scsi_device *sdev)

	h = kzalloc(sizeof(*h) , GFP_KERNEL);
	if (!h)
		return -ENOMEM;
		return SCSI_DH_NOMEM;
	h->lun = UNINITIALIZED_LUN;
	h->state = RDAC_STATE_ACTIVE;

@@ -755,7 +755,7 @@ static int rdac_bus_attach(struct scsi_device *sdev)
		    lun_state[(int)h->lun_state]);

	sdev->handler_data = h;
	return 0;
	return SCSI_DH_OK;

clean_ctlr:
	spin_lock(&list_lock);
@@ -764,7 +764,7 @@ clean_ctlr:

failed:
	kfree(h);
	return -EINVAL;
	return err;
}

static void rdac_bus_detach( struct scsi_device *sdev )
+14 −3
Original line number Diff line number Diff line
@@ -126,20 +126,31 @@ static struct scsi_device_handler *scsi_dh_lookup(const char *name)
static int scsi_dh_handler_attach(struct scsi_device *sdev,
				  struct scsi_device_handler *scsi_dh)
{
	int error;
	int error, ret = 0;

	if (!try_module_get(scsi_dh->module))
		return -EINVAL;

	error = scsi_dh->attach(sdev);
	if (error) {
	if (error != SCSI_DH_OK) {
		switch (error) {
		case SCSI_DH_NOMEM:
			ret = -ENOMEM;
			break;
		case SCSI_DH_RES_TEMP_UNAVAIL:
			ret = -EAGAIN;
			break;
		default:
			ret = -EINVAL;
			break;
		}
		sdev_printk(KERN_ERR, sdev, "%s: Attach failed (%d)\n",
			    scsi_dh->name, error);
		module_put(scsi_dh->module);
	} else
		sdev->handler = scsi_dh;

	return error;
	return ret;
}

/*