mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	blk-mq: allow REQ_NOWAIT to return an error inline
By default, if a caller sets REQ_NOWAIT and we need to block, we'll return -EAGAIN through the bio->bi_end_io() callback. For some use cases, this makes it hard to use. Allow a caller to ask for inline return of errors related to blocking by also setting REQ_NOWAIT_INLINE. Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									c0e48f9dea
								
							
						
					
					
						commit
						893a1c9720
					
				
					 2 changed files with 10 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1960,9 +1960,13 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
 | 
			
		|||
	rq = blk_mq_get_request(q, bio, &data);
 | 
			
		||||
	if (unlikely(!rq)) {
 | 
			
		||||
		rq_qos_cleanup(q, bio);
 | 
			
		||||
		if (bio->bi_opf & REQ_NOWAIT)
 | 
			
		||||
 | 
			
		||||
		cookie = BLK_QC_T_NONE;
 | 
			
		||||
		if (bio->bi_opf & REQ_NOWAIT_INLINE)
 | 
			
		||||
			cookie = BLK_QC_T_EAGAIN;
 | 
			
		||||
		else if (bio->bi_opf & REQ_NOWAIT)
 | 
			
		||||
			bio_wouldblock_error(bio);
 | 
			
		||||
		return BLK_QC_T_NONE;
 | 
			
		||||
		return cookie;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	trace_block_getrq(q, bio, bio->bi_opf);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -311,6 +311,7 @@ enum req_flag_bits {
 | 
			
		|||
	__REQ_RAHEAD,		/* read ahead, can fail anytime */
 | 
			
		||||
	__REQ_BACKGROUND,	/* background IO */
 | 
			
		||||
	__REQ_NOWAIT,           /* Don't wait if request will block */
 | 
			
		||||
	__REQ_NOWAIT_INLINE,	/* Return would-block error inline */
 | 
			
		||||
	/*
 | 
			
		||||
	 * When a shared kthread needs to issue a bio for a cgroup, doing
 | 
			
		||||
	 * so synchronously can lead to priority inversions as the kthread
 | 
			
		||||
| 
						 | 
				
			
			@ -345,6 +346,7 @@ enum req_flag_bits {
 | 
			
		|||
#define REQ_RAHEAD		(1ULL << __REQ_RAHEAD)
 | 
			
		||||
#define REQ_BACKGROUND		(1ULL << __REQ_BACKGROUND)
 | 
			
		||||
#define REQ_NOWAIT		(1ULL << __REQ_NOWAIT)
 | 
			
		||||
#define REQ_NOWAIT_INLINE	(1ULL << __REQ_NOWAIT_INLINE)
 | 
			
		||||
#define REQ_CGROUP_PUNT		(1ULL << __REQ_CGROUP_PUNT)
 | 
			
		||||
 | 
			
		||||
#define REQ_NOUNMAP		(1ULL << __REQ_NOUNMAP)
 | 
			
		||||
| 
						 | 
				
			
			@ -418,12 +420,13 @@ static inline int op_stat_group(unsigned int op)
 | 
			
		|||
 | 
			
		||||
typedef unsigned int blk_qc_t;
 | 
			
		||||
#define BLK_QC_T_NONE		-1U
 | 
			
		||||
#define BLK_QC_T_EAGAIN		-2U
 | 
			
		||||
#define BLK_QC_T_SHIFT		16
 | 
			
		||||
#define BLK_QC_T_INTERNAL	(1U << 31)
 | 
			
		||||
 | 
			
		||||
static inline bool blk_qc_t_valid(blk_qc_t cookie)
 | 
			
		||||
{
 | 
			
		||||
	return cookie != BLK_QC_T_NONE;
 | 
			
		||||
	return cookie != BLK_QC_T_NONE && cookie != BLK_QC_T_EAGAIN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int blk_qc_t_to_queue_num(blk_qc_t cookie)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue