]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - include/linux/blkdev.h
block: add notion of a chunk size for request merging
[thirdparty/linux.git] / include / linux / blkdev.h
index 3cd426e971db6c06675858a7f6a11e801bed8015..dc2c703f05fd1390fb3d1468035ecfccf9eeffd8 100644 (file)
@@ -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,