@ -280,6 +280,7 @@ struct queue_limits {
unsigned long seg_boundary_mask ;
unsigned int max_hw_sectors ;
unsigned int chunk_sectors ;
unsigned int max_sectors ;
unsigned int max_segment_size ;
unsigned int physical_block_size ;
@ -910,6 +911,20 @@ static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q,
return q - > limits . max_sectors ;
}
/*
* Return maximum size of a request at given offset . Only valid for
* file system requests .
*/
static inline unsigned int blk_max_size_offset ( struct request_queue * q ,
sector_t offset )
{
if ( ! q - > limits . chunk_sectors )
return q - > limits . max_hw_sectors ;
return q - > limits . chunk_sectors -
( offset & ( q - > limits . chunk_sectors - 1 ) ) ;
}
static inline unsigned int blk_rq_get_max_sectors ( struct request * rq )
{
struct request_queue * q = rq - > q ;
@ -917,7 +932,11 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq)
if ( unlikely ( rq - > cmd_type = = REQ_TYPE_BLOCK_PC ) )
return q - > limits . max_hw_sectors ;
return blk_queue_get_max_sectors ( q , rq - > cmd_flags ) ;
if ( ! q - > limits . chunk_sectors )
return blk_queue_get_max_sectors ( q , rq - > cmd_flags ) ;
return min ( blk_max_size_offset ( q , blk_rq_pos ( rq ) ) ,
blk_queue_get_max_sectors ( q , rq - > cmd_flags ) ) ;
}
static inline unsigned int blk_rq_count_bios ( struct request * rq )
@ -983,6 +1002,7 @@ extern void blk_queue_make_request(struct request_queue *, make_request_fn *);
extern void blk_queue_bounce_limit ( struct request_queue * , u64 ) ;
extern void blk_limits_max_hw_sectors ( struct queue_limits * , unsigned int ) ;
extern void blk_queue_max_hw_sectors ( struct request_queue * , unsigned int ) ;
extern void blk_queue_chunk_sectors ( struct request_queue * , unsigned int ) ;
extern void blk_queue_max_segments ( struct request_queue * , unsigned short ) ;
extern void blk_queue_max_segment_size ( struct request_queue * , unsigned int ) ;
extern void blk_queue_max_discard_sectors ( struct request_queue * q ,