Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block

* 'for-linus' of git://git.kernel.dk/linux-2.6-block:
Commands needing to be retried require a complete re-initialization.

+19 -11
+11 -7
drivers/cdrom/cdrom.c
··· 2081 2081 if (!q) 2082 2082 return -ENXIO; 2083 2083 2084 - rq = blk_get_request(q, READ, GFP_KERNEL); 2085 - if (!rq) 2086 - return -ENOMEM; 2087 - 2088 2084 cdi->last_sense = 0; 2089 2085 2090 2086 while (nframes) { ··· 2092 2096 2093 2097 len = nr * CD_FRAMESIZE_RAW; 2094 2098 2095 - ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL); 2096 - if (ret) 2099 + rq = blk_get_request(q, READ, GFP_KERNEL); 2100 + if (!rq) { 2101 + ret = -ENOMEM; 2097 2102 break; 2103 + } 2104 + 2105 + ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL); 2106 + if (ret) { 2107 + blk_put_request(rq); 2108 + break; 2109 + } 2098 2110 2099 2111 rq->cmd[0] = GPCMD_READ_CD; 2100 2112 rq->cmd[1] = 1 << 2; ··· 2128 2124 2129 2125 if (blk_rq_unmap_user(bio)) 2130 2126 ret = -EFAULT; 2127 + blk_put_request(rq); 2131 2128 2132 2129 if (ret) 2133 2130 break; ··· 2138 2133 ubuf += len; 2139 2134 } 2140 2135 2141 - blk_put_request(rq); 2142 2136 return ret; 2143 2137 } 2144 2138
+8 -4
drivers/scsi/device_handler/scsi_dh_hp_sw.c
··· 107 107 struct request *req; 108 108 int ret; 109 109 110 + retry: 110 111 req = blk_get_request(sdev->request_queue, WRITE, GFP_NOIO); 111 112 if (!req) 112 113 return SCSI_DH_RES_TEMP_UNAVAIL; ··· 122 121 memset(req->sense, 0, SCSI_SENSE_BUFFERSIZE); 123 122 req->sense_len = 0; 124 123 125 - retry: 126 124 ret = blk_execute_rq(req->q, NULL, req, 1); 127 125 if (ret == -EIO) { 128 126 if (req->sense_len > 0) { ··· 136 136 h->path_state = HP_SW_PATH_ACTIVE; 137 137 ret = SCSI_DH_OK; 138 138 } 139 - if (ret == SCSI_DH_IMM_RETRY) 139 + if (ret == SCSI_DH_IMM_RETRY) { 140 + blk_put_request(req); 140 141 goto retry; 142 + } 141 143 if (ret == SCSI_DH_DEV_OFFLINED) { 142 144 h->path_state = HP_SW_PATH_PASSIVE; 143 145 ret = SCSI_DH_OK; ··· 202 200 struct request *req; 203 201 int ret, retry; 204 202 203 + retry: 205 204 req = blk_get_request(sdev->request_queue, WRITE, GFP_NOIO); 206 205 if (!req) 207 206 return SCSI_DH_RES_TEMP_UNAVAIL; ··· 219 216 req->sense_len = 0; 220 217 retry = h->retries; 221 218 222 - retry: 223 219 ret = blk_execute_rq(req->q, NULL, req, 1); 224 220 if (ret == -EIO) { 225 221 if (req->sense_len > 0) { ··· 233 231 ret = SCSI_DH_OK; 234 232 235 233 if (ret == SCSI_DH_RETRY) { 236 - if (--retry) 234 + if (--retry) { 235 + blk_put_request(req); 237 236 goto retry; 237 + } 238 238 ret = SCSI_DH_IO; 239 239 } 240 240