From: Andrew Vasquez Date: Fri, 31 Aug 2012 04:54:20 +0000 (-0700) Subject: qla2xxx: Correct loop_id_map allocation-size and usage. X-Git-Tag: v2.6.39-400.9.0~335 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=22012b93bb02044ee80ac8516d1dfab32d9bc2c9;p=users%2Fjedix%2Flinux-maple.git qla2xxx: Correct loop_id_map allocation-size and usage. Bugdb: 13653 Original code incorrectly assigned LOOPID_MAP_SIZE to be the allocation size in bytes rather than total bit size. Additionally corrected code to check for bit-allocation failure in qla2x00_find_new_loop_id(). JIRA Key: V2632FC-270 --- diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 2cde41ce591b..faac561b0ca1 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -205,7 +205,7 @@ #define MAX_FIBRE_DEVICES_2400 2048 #define MAX_FIBRE_DEVICES_LOOP 128 #define MAX_FIBRE_DEVICES_MAX MAX_FIBRE_DEVICES_2400 -#define LOOPID_MAP_SIZE (ha->max_fibre_devices / 8) +#define LOOPID_MAP_SIZE (ha->max_fibre_devices) #define MAX_FIBRE_LUNS 0xFFFF #define MAX_HOST_COUNT 16 diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index eeeba5e9f784..bd8e691e51e5 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -3410,8 +3410,8 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) dev->loop_id = find_first_zero_bit(ha->loop_id_map, LOOPID_MAP_SIZE); - - if (qla2x00_is_reserved_id(vha, dev->loop_id)) { + if (dev->loop_id >= LOOPID_MAP_SIZE || + qla2x00_is_reserved_id(vha, dev->loop_id)) { dev->loop_id = FC_NO_LOOP_ID; rval = QLA_FUNCTION_FAILED; } else diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index d17917c01937..aa8a15e03b70 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -3178,7 +3178,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, INIT_LIST_HEAD(&ha->vp_list); /* Allocate memory for our loop_id bitmap */ - ha->loop_id_map = kzalloc(LOOPID_MAP_SIZE, GFP_KERNEL); + ha->loop_id_map = kzalloc(BITS_TO_LONGS(LOOPID_MAP_SIZE) * sizeof(long), + GFP_KERNEL); if (!ha->loop_id_map) goto fail_async_pd; else {