When iterating a list, a particular request may need to be moved for special handling. Provide a helper function to achieve that so drivers don't need to reimplement rqlist manipulation.
Unified · Split
| @@ -249,6 +249,23 @@ static inline unsigned short req_get_ioprio(struct request *req) · 248 unmodified lines | |||
| 249 | #define rq_list_next(rq) (rq)->rq_next | 249 | #define rq_list_next(rq) (rq)->rq_next |
| 250 | #define rq_list_empty(list) ((list) == (struct request *) NULL) | 250 | #define rq_list_empty(list) ((list) == (struct request *) NULL) |
| 251 | 251 | ||
| 252 | /** | ||
| 253 | * rq_list_move() - move a struct request from one list to another | ||
| 254 | * @src: The source list @rq is currently in | ||
| 255 | * @dst: The destination list that @rq will be appended to | ||
| 256 | * @rq: The request to move | ||
| 257 | * @prev: The request preceding @rq in @src (NULL if @rq is the head) | ||
| 258 | */ | ||
| 259 | static void inline rq_list_move(struct request **src, struct request **dst, | ||
| 260 | struct request *rq, struct request *prev) | ||
| 261 | { | ||
| 262 | if (prev) | ||
| 263 | prev->rq_next = rq->rq_next; | ||
| 264 | else | ||
| 265 | *src = rq->rq_next; | ||
| 266 | rq_list_add(dst, rq); | ||
| 267 | } | ||
| 268 | |||
| 252 | enum blk_eh_timer_return { | 269 | enum blk_eh_timer_return { |
| 253 | BLK_EH_DONE, /* drivers has completed the command */ | 270 | BLK_EH_DONE, /* drivers has completed the command */ |
| 254 | BLK_EH_RESET_TIMER, /* reset timer and try again */ | 271 | BLK_EH_RESET_TIMER, /* reset timer and try again */ |