Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
"Two patches, both in drivers.

The iscsi one is fixing the cpumask issue you commented on and the ufs
one is a late arriving fix for conditions that can occur in Host
Performance Booster reads"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: ufs: core: Fix referencing invalid rsp field
scsi: target: Fix incorrect use of cpumask_t

Changed files
+43 -32
drivers
+7 -12
drivers/scsi/ufs/ufshpb.c
··· 1254 1254 struct utp_hpb_rsp *rsp_field = &lrbp->ucd_rsp_ptr->hr; 1255 1255 int data_seg_len; 1256 1256 1257 + data_seg_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) 1258 + & MASK_RSP_UPIU_DATA_SEG_LEN; 1259 + 1260 + /* If data segment length is zero, rsp_field is not valid */ 1261 + if (!data_seg_len) 1262 + return; 1263 + 1257 1264 if (unlikely(lrbp->lun != rsp_field->lun)) { 1258 1265 struct scsi_device *sdev; 1259 1266 bool found = false; ··· 1292 1285 dev_notice(&hpb->sdev_ufs_lu->sdev_dev, 1293 1286 "%s: ufshpb state is not PRESENT/SUSPEND\n", 1294 1287 __func__); 1295 - return; 1296 - } 1297 - 1298 - data_seg_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) 1299 - & MASK_RSP_UPIU_DATA_SEG_LEN; 1300 - 1301 - /* To flush remained rsp_list, we queue the map_work task */ 1302 - if (!data_seg_len) { 1303 - if (!ufshpb_is_general_lun(hpb->lun)) 1304 - return; 1305 - 1306 - ufshpb_kick_map_work(hpb); 1307 1288 return; 1308 1289 } 1309 1290
+22 -10
drivers/target/iscsi/iscsi_target.c
··· 3596 3596 void iscsit_thread_get_cpumask(struct iscsi_conn *conn) 3597 3597 { 3598 3598 int ord, cpu; 3599 - cpumask_t conn_allowed_cpumask; 3600 - 3601 - cpumask_and(&conn_allowed_cpumask, iscsit_global->allowed_cpumask, 3602 - cpu_online_mask); 3599 + cpumask_var_t conn_allowed_cpumask; 3603 3600 3604 3601 /* 3605 3602 * bitmap_id is assigned from iscsit_global->ts_bitmap from ··· 3606 3609 * iSCSI connection's RX/TX threads will be scheduled to 3607 3610 * execute upon. 3608 3611 */ 3609 - cpumask_clear(conn->conn_cpumask); 3610 - ord = conn->bitmap_id % cpumask_weight(&conn_allowed_cpumask); 3611 - for_each_cpu(cpu, &conn_allowed_cpumask) { 3612 - if (ord-- == 0) { 3613 - cpumask_set_cpu(cpu, conn->conn_cpumask); 3614 - return; 3612 + if (!zalloc_cpumask_var(&conn_allowed_cpumask, GFP_KERNEL)) { 3613 + ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); 3614 + for_each_online_cpu(cpu) { 3615 + if (ord-- == 0) { 3616 + cpumask_set_cpu(cpu, conn->conn_cpumask); 3617 + return; 3618 + } 3615 3619 } 3620 + } else { 3621 + cpumask_and(conn_allowed_cpumask, iscsit_global->allowed_cpumask, 3622 + cpu_online_mask); 3623 + 3624 + cpumask_clear(conn->conn_cpumask); 3625 + ord = conn->bitmap_id % cpumask_weight(conn_allowed_cpumask); 3626 + for_each_cpu(cpu, conn_allowed_cpumask) { 3627 + if (ord-- == 0) { 3628 + cpumask_set_cpu(cpu, conn->conn_cpumask); 3629 + free_cpumask_var(conn_allowed_cpumask); 3630 + return; 3631 + } 3632 + } 3633 + free_cpumask_var(conn_allowed_cpumask); 3616 3634 } 3617 3635 /* 3618 3636 * This should never be reached..
+14 -10
drivers/target/iscsi/iscsi_target_configfs.c
··· 1137 1137 static ssize_t lio_target_wwn_cpus_allowed_list_store( 1138 1138 struct config_item *item, const char *page, size_t count) 1139 1139 { 1140 - int ret; 1140 + int ret = -ENOMEM; 1141 1141 char *orig; 1142 - cpumask_t new_allowed_cpumask; 1142 + cpumask_var_t new_allowed_cpumask; 1143 + 1144 + if (!zalloc_cpumask_var(&new_allowed_cpumask, GFP_KERNEL)) 1145 + goto out; 1143 1146 1144 1147 orig = kstrdup(page, GFP_KERNEL); 1145 1148 if (!orig) 1146 - return -ENOMEM; 1149 + goto out_free_cpumask; 1147 1150 1148 - cpumask_clear(&new_allowed_cpumask); 1149 - ret = cpulist_parse(orig, &new_allowed_cpumask); 1151 + ret = cpulist_parse(orig, new_allowed_cpumask); 1152 + if (!ret) 1153 + cpumask_copy(iscsit_global->allowed_cpumask, 1154 + new_allowed_cpumask); 1150 1155 1151 1156 kfree(orig); 1152 - if (ret != 0) 1153 - return ret; 1154 - 1155 - cpumask_copy(iscsit_global->allowed_cpumask, &new_allowed_cpumask); 1156 - return count; 1157 + out_free_cpumask: 1158 + free_cpumask_var(new_allowed_cpumask); 1159 + out: 1160 + return ret ? ret : count; 1157 1161 } 1158 1162 1159 1163 CONFIGFS_ATTR(lio_target_wwn_, cpus_allowed_list);