Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull SCSI fixes from James Bottomley:
"Three small fixes in the UFS driver: two are for power management
issues and the third is to fix a slew of problem in the sysfs code"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: ufs: Fix race between shutdown and runtime resume flow
scsi: ufs: Make sure clk scaling happens only when HBA is runtime ACTIVE
scsi: ufs: Fix unexpected values from ufshcd_read_desc_param()

+23 -14
+23 -14
drivers/scsi/ufs/ufshcd.c
··· 1294 1294 } 1295 1295 spin_unlock_irqrestore(hba->host->host_lock, irq_flags); 1296 1296 1297 + pm_runtime_get_noresume(hba->dev); 1298 + if (!pm_runtime_active(hba->dev)) { 1299 + pm_runtime_put_noidle(hba->dev); 1300 + ret = -EAGAIN; 1301 + goto out; 1302 + } 1297 1303 start = ktime_get(); 1298 1304 ret = ufshcd_devfreq_scale(hba, scale_up); 1305 + pm_runtime_put(hba->dev); 1299 1306 1300 1307 trace_ufshcd_profile_clk_scaling(dev_name(hba->dev), 1301 1308 (scale_up ? "up" : "down"), ··· 3199 3192 /* Get the length of descriptor */ 3200 3193 ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len); 3201 3194 if (!buff_len) { 3202 - dev_err(hba->dev, "%s: Failed to get desc length", __func__); 3195 + dev_err(hba->dev, "%s: Failed to get desc length\n", __func__); 3196 + return -EINVAL; 3197 + } 3198 + 3199 + if (param_offset >= buff_len) { 3200 + dev_err(hba->dev, "%s: Invalid offset 0x%x in descriptor IDN 0x%x, length 0x%x\n", 3201 + __func__, param_offset, desc_id, buff_len); 3203 3202 return -EINVAL; 3204 3203 } 3205 3204 3206 3205 /* Check whether we need temp memory */ 3207 3206 if (param_offset != 0 || param_size < buff_len) { 3208 - desc_buf = kmalloc(buff_len, GFP_KERNEL); 3207 + desc_buf = kzalloc(buff_len, GFP_KERNEL); 3209 3208 if (!desc_buf) 3210 3209 return -ENOMEM; 3211 3210 } else { ··· 3225 3212 desc_buf, &buff_len); 3226 3213 3227 3214 if (ret) { 3228 - dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d", 3215 + dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d\n", 3229 3216 __func__, desc_id, desc_index, param_offset, ret); 3230 3217 goto out; 3231 3218 } 3232 3219 3233 3220 /* Sanity check */ 3234 3221 if (desc_buf[QUERY_DESC_DESC_TYPE_OFFSET] != desc_id) { 3235 - dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header", 3222 + dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header\n", 3236 3223 __func__, desc_buf[QUERY_DESC_DESC_TYPE_OFFSET]); 3237 3224 ret = -EINVAL; 3238 3225 goto out; ··· 3242 3229 buff_len = desc_buf[QUERY_DESC_LENGTH_OFFSET]; 3243 3230 ufshcd_update_desc_length(hba, desc_id, desc_index, buff_len); 3244 3231 3245 - /* Check wherher we will not copy more data, than available */ 3246 - if (is_kmalloc && (param_offset + param_size) > buff_len) 3247 - param_size = buff_len - param_offset; 3248 - 3249 - if (is_kmalloc) 3232 + if (is_kmalloc) { 3233 + /* Make sure we don't copy more data than available */ 3234 + if (param_offset + param_size > buff_len) 3235 + param_size = buff_len - param_offset; 3250 3236 memcpy(param_read_buf, &desc_buf[param_offset], param_size); 3237 + } 3251 3238 out: 3252 3239 if (is_kmalloc) 3253 3240 kfree(desc_buf); ··· 8913 8900 if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba)) 8914 8901 goto out; 8915 8902 8916 - if (pm_runtime_suspended(hba->dev)) { 8917 - ret = ufshcd_runtime_resume(hba); 8918 - if (ret) 8919 - goto out; 8920 - } 8903 + pm_runtime_get_sync(hba->dev); 8921 8904 8922 8905 ret = ufshcd_suspend(hba, UFS_SHUTDOWN_PM); 8923 8906 out: