On the other hand, in __make_request(), get_request() is called without __GFP_WAIT flag at the first time. Thus, the get_request() fails when there is no existing queue, typically when it's called for the first I/O request of the process to the device. Though it will be followed by get_request_wait() for general case, __make_request() will just end the I/O with an error (EWOULDBLOCK) when the request was for read-ahead.
Unified · Split
| @@ -1202,13 +1202,16 @@ retry: · 1201 unmodified lines | ||
| 1202 | 1202 | if (new_cfqq) { |
| 1203 | 1203 | cfqq = new_cfqq; |
| 1204 | 1204 | new_cfqq = NULL; |
| 1205 | − } else if (gfp_mask & __GFP_WAIT) { | |
| 1205 | + } else { | |
| 1206 | 1206 | spin_unlock_irq(cfqd->queue->queue_lock); |
| 1207 | 1207 | new_cfqq = kmem_cache_alloc(cfq_pool, gfp_mask); |
| 1208 | 1208 | spin_lock_irq(cfqd->queue->queue_lock); |
| 1209 | + | |
| 1210 | + if (!new_cfqq && !(gfp_mask & __GFP_WAIT)) | |
| 1211 | + goto out; | |
| 1212 | + | |
| 1209 | 1213 | goto retry; |
| 1210 | − } else | |
| 1211 | − goto out; | |
| 1214 | + } | |
| 1212 | 1215 | |
| 1213 | 1216 | memset(cfqq, 0, sizeof(*cfqq)); |
| 1214 | 1217 | |