|
@@ -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,
|