mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	block: allow device to have both virt_boundary_mask and max segment size
When one stacking device is over one device with virt_boundary_mask and another one with max segment size, the stacking device have both limits set. This way is allowed befored690cb8ae1("block: add an API to atomically update queue limits"). Relax the limit so that we won't break such kind of stacking setting. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218687 Reported-by: janpieter.sollie@edpnet.be Fixes:d690cb8ae1("block: add an API to atomically update queue limits") Link: https://lore.kernel.org/linux-block/ZfGl8HzUpiOxCLm3@fedora/ Cc: Christoph Hellwig <hch@lst.de> Cc: Mike Snitzer <snitzer@kernel.org> Cc: dm-devel@lists.linux.dev Cc: Song Liu <song@kernel.org> Cc: linux-raid@vger.kernel.org Signed-off-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Mike Snitzer <snitzer@kernel.org> Link: https://lore.kernel.org/r/20240407131931.4055231-1-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									8b8ace0803
								
							
						
					
					
						commit
						b561ea56a2
					
				
					 1 changed files with 6 additions and 10 deletions
				
			
		| 
						 | 
					@ -182,17 +182,13 @@ static int blk_validate_limits(struct queue_limits *lim)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Devices that require a virtual boundary do not support scatter/gather
 | 
						 * Stacking device may have both virtual boundary and max segment
 | 
				
			||||||
	 * I/O natively, but instead require a descriptor list entry for each
 | 
						 * size limit, so allow this setting now, and long-term the two
 | 
				
			||||||
	 * page (which might not be identical to the Linux PAGE_SIZE).  Because
 | 
						 * might need to move out of stacking limits since we have immutable
 | 
				
			||||||
	 * of that they are not limited by our notion of "segment size".
 | 
						 * bvec and lower layer bio splitting is supposed to handle the two
 | 
				
			||||||
 | 
						 * correctly.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (lim->virt_boundary_mask) {
 | 
						if (!lim->virt_boundary_mask) {
 | 
				
			||||||
		if (WARN_ON_ONCE(lim->max_segment_size &&
 | 
					 | 
				
			||||||
				 lim->max_segment_size != UINT_MAX))
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
		lim->max_segment_size = UINT_MAX;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * The maximum segment size has an odd historic 64k default that
 | 
							 * The maximum segment size has an odd historic 64k default that
 | 
				
			||||||
		 * drivers probably should override.  Just like the I/O size we
 | 
							 * drivers probably should override.  Just like the I/O size we
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue